题目 : Tree Traversals Again
分值 : 25
难度 : 中等题
思路 : 根据题目意思,利用他给的模拟栈操作去构建树,然后去弄出后续遍历
坑点 : 一开始我把 push的数字当作前序序列(他的确是前序),把pop的数字当作是中序序列(也的确)
是中序,然后根据前序序列和中序序列去搞出后序序列,用的是自己的小技巧,按照前序序列插入
比较大小准则则用该对象在中序序列的下标:因为在中序序列中,下标从小到大是 左 中 右
因此可以作为插入建树的比较准则 -> 去判断应该插在左子树还是右子树, 但在这题当中因为
题目特殊性,进来的节点可能是重复的,这就让我这个搜索元素下标的子函数混淆了,他无法标记
相同元素进入的前后性质.因此是行不通的.
故而思索再三,觉得只能够依据它输入的 push 队列和 pop 队列去寻找规律,发现每次push是
在当前节点下插入一个节点,且遵循先左子树后右子树的特点.而 Pop 则是将一个节点 Pop出去
如果这个节点被 pop过则继续往上 pop,相当于游标往上移动,换句话说,pop 操作是从一些节点
往上追溯到下一个插入的节点,所以我在节点结构体中加入 bool pop 表征这个节点是否被pop过
如果没有,则代表这个节点pop就行,游标停在当前节点,下次如果进来一个push就是对这个节点进
行插入操作.如果有那么游标就要向上找到第一个没有被pop的父节点来作为下一次push的操作节点.
具体代码如下
1 |
|