算法思想
后序遍历序列的最后一个节点是根节点,而中序遍历的根节点左侧都是左子树的节点,右侧都是右子树的节点,根据这种特点,我们可以从后序遍历中找到根节点,再在中序遍历中找到根节点,然后递归的对中序遍历的左子树及右子树进行建树;
代码
struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) {} }; TreeNode *build(vector<int>& in, vector<int>& post,int postl,int postr,int inl,int inr){ if(inl>inr||postl>postr)return NULL;//如果左边界大于右边界则返回 TreeNode *x=new TreeNode(post[postr]);//新建一个节点 int k=inl;//开始搜索根节点 while(in[k]!=post[postr])k++;//k指向中序遍历的根节点,其左边是左子树的中序序列,右边是右子树的中序序列 x->left=build(in,post,postl,postl+k-inl-1,inl,k-1);//递归的对左子树建树 x->right=build(in,post,postl+k-inl,postr-1,k+1,inr);//递归的对右子树建树 return x;//返回根节点 } TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) { return build(inorder,postorder,0,inorder.size()-1,0,postorder.size()-1) }
type TreeNode struct { Val int Left *TreeNode Right *TreeNode } func build(in ,post []int,inl ,inr ,postl ,postr int)*TreeNode{ if inl>inr||postl>postr { return nil } root:= &TreeNode{Val:post[postr]} k := inl for in[k]!=post[postr]{ k++ } root.Left=build(in,post,inl,k-1,postl,postl+k-inl-1) root.Right=build(in,post,k+1,inr,postl+k-inl,postr-1) return root } func buildTree(inorder []int, postorder []int) *TreeNode { return build(inorder,postorder,0,len(inorder)-1,0,len(postorder)) }golang