思路如下:
通过观察题目可以发现 "Pop" 的就是中序序列打印出来的数据如题意给出即中序序列为 "3 2 4 1 6 5"。但问题是我当前 "Pop" 比如打印 3,前面 1 和 2 都是 3 的祖先,这应该用什么方法在未确定祖先的情况下打印子孙结点——我想到了递归,递归就是把一件事先走到最底做,然后再回过头来做——对应这里是我不管前面 1 和 2,先关注最后的 3
那么大致思路可以得到了,遇到 "Push" 的时候就新建 node_t 类型结点并赋值数据域;遇到 "Pop" 的时候返回,我试着顺着这个思路模拟发现可行:
遇到 "Push" 的处理手法:
遇到 "Pop" 的处理手法:
有兴趣的读者可以试试模拟,就不继续画了,有点丑(捂脸)
/* 伪码 */ node_t *create() { if (遇到 "Pop") return NULL; node_t *root = new node_t; root->data = push_x(); root->left = create(); root->right = create(); return root; }
剩下的就是 1) 处理输入;以及2) 后序遍历,不过都很简单