(1)确定树的根节点。树根是当前树中所有元素在先序遍历中最先出现的元素,即先序遍历的第一个结点就是二叉树的跟
(2)求解树的子树。找到根在中序遍历的位置,位置左边就是二叉树的左孩子,位置右边是二叉树的右孩子,如果跟结点左边或右边为空,那么该方向子树为空;如果根节点左边和右边都为空,那么根节点已经为叶子节点。
}
(2)求解树的子树。找到根在中序遍历的位置,位置左边就是二叉树的左孩子,位置右边是二叉树的右孩子,如果跟结点左边或右边为空,那么该方向子树为空;如果根节点左边和右边都为空,那么根节点已经为叶子节点。
(3)对二叉树的左、右孩子分别进行步骤(1)(2),直到求出二叉树的结构为止。
public class Main {
public static void main(String[] args) {
int[] preorder = {1,2,4,7,3,5,6,8};
int[] inorder = {4,7,2,1,5,3,8,6};
//System.out.println(preorder[0]);
TreeNode root = Solution.reConstructBinaryTree(inorder, 0,7, preorder, 0, 7);
Solution.printTreePre(root);
}
}
class Solution {
static int i = 0;
public static void printTreePre(TreeNode root){//遍历
if(root==null){
return;
}
System.out.println(root.val);//先序遍历
//left
// if(root.left !=null){
// System.out.println("left"+root.left.val);
// }
printTreePre(root.left);
System.out.println(root.val);//中序遍历
//right
// if(root.right !=null){
// System.out.println("right"+root.right.val);
// }
printTreePre(root.right);
System.out.println(root.val);//后序遍历
}
//重构树
public static TreeNode reConstructBinaryTree(int[] in,int inStart,int inEnd, int[] pre, int preStart,int preEnd) {
if(inStart > inEnd || preStart > preEnd){
return null;
}
TreeNode root = new TreeNode(pre[preStart]);
int indexDivider = 0;
for(;indexDivider<=inEnd;indexDivider++){
if(in[indexDivider]==root.val){
break;
}
}
//int offSet =
TreeNode left = reConstructBinaryTree(in, inStart, indexDivider-1, pre, preStart+1, preStart+indexDivider-inStart);
TreeNode right = reConstructBinaryTree(in, indexDivider+1, inEnd, pre, preStart+indexDivider-inStart+1, preEnd);
root.left = left;
root.right = right;
return root;
}
}