algorithm - 如何迭代地从中序和后序遍历构造二叉树?
问题描述
从 Inorder 和 Postorder Traversal 迭代地构造二叉树。
我已经看到了如何使用递归来做到这一点,但我正在寻找一个迭代构造二叉树的答案。
我为中序和前序编写了一个算法,但我想知道如何为中序和后序修改它?
注意:它是伪代码,“=”表示“==”
节点:
e: TElement
right: PNode (pointer to a Node)
left: PNode (pointer to a Node)
二叉树:
root: PNode
子算法树(前序,中序)
pre:预购:Int[],中序:Int[]
preOrderIndex<- 0;
inOrderIndex<-0;
Stack(s)
root <- createNode(preorder[0])
push(s, root)
preOrderIndex<-preOrderIndex +1
While !empty(s)
element(s, top) //which is the same as top = peak(s)
if [top].e = inorder[inOrderIndex]
delete(s, top) //delete the element from the stack
inOrderIndex<-inOrderIndex +1
if inOrderIndex = length(inorder)
return root
End if
element(s, elem)
if !empty(s) and [elem].e = inorder[inOrderIndex]
continue
End if
nod <- createNode(preorder[preOrderIndex])
[top].right<-nod
preOrderIndex<-preOrderIndex +1
push(s,nod)
Else
nod <- createNode(preorder[preOrderIndex])
[top].left<-nod
preOrderIndex<-preOrderIndex +1
push(s,nod)
End if
End while
return root
结束子算法
编辑:我找到了答案
解决方案
当您有一个给定前序和中序遍历的工作解决方案时,您可以使用以下观察将其转换为给定后序和中序遍历的解决方案:
中序遍历的逆序等于镜像树的中序遍历(左右交换)
后序遍历的逆序等于镜像树的前序遍历
因此,对您的工作算法进行以下更改:
- 重命名
pre
为post
变量名中出现的任何地方 - 初始化
postOrderIndex
并inOrderIndex
使用length(inorder)-1
- 用递减语句替换它们的递增语句
- 将退出条件替换为
if inOrderIndex < 0
- 替换
left
为right
,反之亦然
推荐阅读
- c++ - 架构 x86_64 的未定义符号:缺少包?
- python - 多对多关系数据获取
- postgresql - 尝试刷新 Power BI 中的数据集时,远程证书根据验证过程无效
- gitlab - 如何在 gitlab-ci 中使用规则
- azure - 在 Azure Application Insights 中,EvenCounter 和预聚合指标有什么区别?
- java - 内存泄漏 - 服务调用静态方法
- java - 如何将 Java 指向符号链接
- python - 使用条件映射来自另一个数据帧的数据帧值
- spark-ar-studio - 仅在张开嘴时显示材料?
- spring-boot - 是否可以在与主应用程序不同的端口上运行 SpringFox 的 swagger 和 swagger-ui?