一、已知二叉树中序后序遍历序列,求前序遍历序列
一棵二叉树的中序遍历序列和后序遍历序列如下
中序:{3,2,4,1,6,5}
后序:{3,4,2,6,5,1}
已知中序遍历的顺序是 左子树、根结点、右子树;后序遍历的顺序是左子树、右子树、根结点
那么后序遍历序列的最右边一定是整个树的根结点
在上面的序列中1是整个树的根结点,我们在中序序列中找到这个树的根结点的位置即可划分出左右子树

end - i为右子树的结点个数,要寻找左子树的根结点,在后序序列中让root减去右子树结点个数再减1即可
右子树的根结点在后序序列中显然为root - 1
递归实现即可
// 求前序遍历序列
public void preOrder(int root, int start, int end) {
if (start > end) {
return;
}
int i = start;
// 在中序遍历中找到根节点的位置
while (mid[i] != post[root]) {
i++;
}
// 输出根节点
System.out.print(mid[i]);
// 递归遍历左子树
preOrder(root - end + i - 1, start, i - 1);
// 递归遍历右子树
preOrder(root - 1, i + 1, end);
}
二、已知二叉树前序中序遍历序列,求后序遍历序列
按照上面的思路,前序遍历是根节点,左子树,右子树。前序序列第一个是整个树的根结点,然后依然在中序序列中找到根结点的位置划分左右子树

左子树根结点在前序序列中显然是root+1,i - start是左子树结点的个数,root + (i - start) + 1即为右子树根结点的位置
//求后序遍历序列
public void postOrder(int root, int start, int end) {
if (start > end) {
return;
}
int i = start;
while (mid[i] != pre[root]) {
i++;
}
postOrder(root + 1, start, i - 1);
postOrder(root + i - start + 1, i + 1, end);
System.out.println(mid[i]);
}
36万+

被折叠的 条评论
为什么被折叠?



