注意点;
1.确定整棵二叉树的根节点即先序遍历中的第一个元素root
2.确定root在中序遍历元素的位置,root左边的元素为二叉树的左子树元素Lchild,右边为右子树元素Rchild
3.在先序遍历中找到最先出现Lchild中元素的那个元素,为Lchild的根节点——root的左孩子节点,同理找出Rchild的根节点——root的右孩子节点
4.重复2,3步骤直至二叉树构建完成;
代码如下:
//利用先序遍历和中序遍历重新构建二叉树;
// Definition for binary tree
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
public class reConstructBinaryTree {
//重新构建二叉树
public static TreeNode reConstructBinaryTree1(int[] pre, int[] in) {//pre先序遍历,in中序遍历
if (pre.length == 0 || in.length == 0 || pre.length != in.length) {
return null;
}//如果没有遍历,或者遍历不一致,则返回为null
TreeNode root = new TreeNode(pre[0]);//定义二叉树的根节点
int i = 0;
while (in[i] != pre[0]) {//找到根节点再中序遍历里的位置,
i++;
}
// 中序遍历中,根节点左侧为左子树节点,右侧为右子树节点
int[] preLeft = new int[i];//左子树先序遍历
int[] inLeft = new int[i]; //左子树中序遍历
int[] preRight = new int[pre.length - i - 1];//右子树先序遍历
int[] inRight = new int[in.length - i - 1];//右子树中序遍历
for (int j = 0; j < in.length; j++) {
if (j < i) {
preLeft[j] = pre[j + 1];
inLeft[j] = in[j];
} else if (j > i) {
preRight[j - i - 1] = pre[j];
inRight[j - i - 1] = in[j];
}
}
root.left = reConstructBinaryTree1(preLeft, inLeft);//递归构建左子树
root.right = reConstructBinaryTree1(preRight, inRight);//递归构建右子树
return root;//返回重新构建二叉树
}
public static void last(TreeNode tr) {//后序遍历遍历二叉树
if (tr == null) {
return;
}
last(tr.left);
last(tr.right);
System.out.print(tr.val + " ");
}
public static void main(String[] args) {
int[] a = {1, 2, 4, 7, 3, 5, 6, 8};
int[] b = {4, 7, 2, 1, 5, 3, 8, 6};
TreeNode root = reConstructBinaryTree1(a, b);
last(root);
System.out.println();
}
}