已知二叉树先序遍历、中序遍历,求后序遍历。
做法是:通过先序,找到根节点,然后通过根节点的位置,将中序分为左子树和右子树
做法是:通过先序,找到根节点,然后通过根节点的位置,将中序分为左子树和右子树
然后通过中序中左子树和右子树的个数,将先序分为左子树和右子树,然后递归建立二叉树。
class Node1 {
char val;
Node1 left;
Node1 right;
public Node1(char val) {
this.val = val;
}
}
/**
* 已知二叉树先序、中序,求后序
* 做法是:通过先序,找到根节点,然后通过根节点的位置,将中序分为左子树和右子树
* 然后通过中序中左子树和右子树的个数,将先序分为左子树和右子树,然后递归建立二叉树。
*/
public class ReconstructBiTree {
//后序遍历二叉树
private static void postOrder(Node1 root) {
if (root == null)
return;
postOrder(root.left);
postOrder(root.right);
System.out.print(root.val + " ");
}
public static void main(String[] args) {
String pre = "ABDHIEJCFKG";//先序
String in = "HDIBEJAFKCG";//中序
char[] preorder = pre.toCharArray();
char[] inorder = in.toCharArray();
Node1 root = reconstruct(preorder, 0, preorder.length - 1, inorder, 0, inorder.length - 1);
postOrder(root);
}
//重建二叉树
private static Node1 reconstruct(char[] pre, int i, int j, char[] in, int k, int l) {
if (i > j || k > l)
return null;
Node1 root = new Node1(pre[i]);
for (int m = k; m <= l; m++) {
if (in[m] == pre[i]) {
root.left = reconstruct(pre, i + 1, i + m - k, in, k, m - 1);
root.right = reconstruct(pre, m - k + i + 1, j, in, m + 1, l);
break;
}
}
return root;
}
}
输出结果:
H I D J E B K F G C A