根据后序和中序重建二叉树

题目描述:

Given inorder and postorder traversal of a tree, construct the binary tree.

Note:
You may assume that duplicates do not exist in the tree.

根据一个二叉树的中序结果和后序结果,重建二叉树。(注意:此二叉树中没有相同的元素)

解题思路:

我们知道中序的顺序是:左孩子---根---右孩子,后序的顺序是:左孩子---右孩子---根,所以我们可以确认,后序的最后一个元素一定是这棵二叉树的根结点(重建二叉树,是必须知道二叉树的中序的),我们拿着找到的根结点,去中序里找到根结点,根据中序的顺序特性,我们确定在根结点前的元素一定是这棵树的左子树,根结点后面的元素一定是这棵树的右子树,此时,我们将这个大问题转换成了两个小问题(子问题思想),我们只需要解决左子树的问题和右子树的问题即可,不难发现左右子树的处理方法和前面的思想是一样的,我们通过递归调用原函数即可实现即可实现

/**
 * Definition for binary tree
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
*/

class Solution {
public:
    TreeNode *buildTree(vector &inorder, vector &postorder) {
          return buildTree(inorder,0,inorder.size()-1,postorder,0,postorder.size()-1);
    }

    TreeNode *buildTree(vector &inorder,int nleft,int nright,vector &postorder,int mleft,int mright)
    {
        if(nleft>nright || mleft>mright)
            return NULL;
        TreeNode *Cur = new TreeNode(postorder[mright]);
        int i = 0;
        //遍历中序,找到树的根结点
        for(i=nleft;ival)
                break;
        }
        //此时,分别递归处理左子树和右子树
        //注意递归只能postorder的index处理
        //我们只要牢记i-nleft是inorder中根结点到左边起始点的距离
        //那么在postorder中,左子树应该就是mleft+i-nleft-1
        Cur->left = buildTree(inorder,nleft,i-1,postorder,mleft,mleft+i-nleft-1);
        Cur->right = buildTree(inorder,i+1,nright,postorder,mleft+i-nleft,mright-1);
        return Cur;
    }
};

 

你可能感兴趣的:(根据后序和中序重建二叉树)