根据中序、后续遍历序列构建二叉树

算法思想

  后序遍历序列的最后一个节点是根节点,而中序遍历的根节点左侧都是左子树的节点,右侧都是右子树的节点,根据这种特点,我们可以从后序遍历中找到根节点,再在中序遍历中找到根节点,然后递归的对中序遍历的左子树及右子树进行建树;

代码

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

 

上一篇:PAT 1127 ZigZagging on a Tree


下一篇:ECS初体验