/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public void fun(TreeNode s,int[]preorder,int[]inorder)
{
if(preorder.length==1)
{
s.left=null;s.right=null;
}
int left=0,right=0;//s点的左右子树有几个点
for(int i=0;i<inorder.length;i++)
{
if(inorder[i]==s.val)
{
break;
}
left++;
}
right=inorder.length-left-1;//减去左子树个数和本身结点
if(left!=0)//有左子树 就是先序便利的第二个
{
TreeNode lchild=new TreeNode(preorder[1]);
s.left=lchild;
int pre[]=new int[left];
for(int i=0;i<left;i++)//左子树枝上的所有结点的先序便利
{
pre[i]=preorder[i+1];//除了s本身的前left个
}
int in[]=new int[left];
for(int i=0;i<left;i++)//左子树枝上的所有结点的zhong序便利
{
in[i]=inorder[i];//前left个
}
fun(s.left,pre,in);//递归
}
else s.left=null;
if(right!=0)//有you子树 就是先序便利的第2+left个
{
TreeNode rchild=new TreeNode(preorder[1+left]);
s.right=rchild;
int pre[]=new int[right];
for(int i=0;i<right;i++)//you子树枝上的所有结点的先序便利
{
pre[i]=preorder[i+1+left];//除了s本身的前left个
}
int in[]=new int[right];
for(int i=0;i<right;i++)//左子树枝上的所有结点的zhong序便利
{
in[i]=inorder[i+left+1];//前left个
}
fun(s.right,pre,in);//递归
}
else s.right=null;
};
/*
先序便利 前面一定是左子树(通过中序便利可以判断是前几个) 后面是右子树 中序便利可以通过顶点把左右子树分开
*/
public TreeNode buildTree(int[] preorder, int[] inorder)
{
if(preorder.length==0)
{
return null;
}
TreeNode ans=new TreeNode(preorder[0]);
fun(ans,preorder,inorder);
return ans;
}
}
Given preorder and inorder traversal of a tree, construct the binary tree.
Note:
You may assume that duplicates do not exist in the tree.
For example, given
preorder = [3,9,20,15,7] inorder = [9,3,15,20,7]
Return the following binary tree:
3 / \ 9 20 / \ 15 7
解法:根据先序和中序写出树,知道每个顶点和他所在树的先序和中序,然后按照注释的方法。