图解从中序与后序遍历序列构造二叉树

题目:

根据一棵树的中序遍历与后序遍历构造二叉树。
 
注意:
你可以假设树中没有重复的元素。
例如,给出
中序遍历  inorder = [9,3,15,20,7]
后序遍历 postorder = [9,15,7,20,3]
返回如下的二叉树:
 
    3
   / \
  9  20
    /  \
   15   7
 
 

思路:


这两个表格是中序和后序的遍历数组,我们定义 inorder在闭区间[inStart,inEnd]内, postorder在闭区间[poStart,poEnd]内。
第一步:先找到根节点,由后序遍历可知根节点是后序遍历数组中的最后一个元素,在上图中标出,记根节点值rootVal 为 postorder[poEnd]
第二步,找到根节点值在中序遍历数组中的位置,记为index,使 inorder[index] == rootVal,如下图所示
第三步:可以找到左子树在数组中的长度,如下图所示:
由上述可知:9为根节点的左子树,15,20,7节点为根节点的右子树的节点,这是需要找到右子树的根节点,然后去找到右子树的左子树和右子树的右子树来构造根节点下的右子树。
于是我们在15,20,7中重复上述的一二三步,如下图所示:

所以我们根据上述的分析步骤去递归实现代码,如下所示。

代码:

 
class Solution {
public:
    TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
        return buildHelp(inorder,0,inorder.size()-1,postorder,0,postorder.size()-1);
    }
    TreeNode *buildHelp(vector<int>& inorder,int inStart,int inEnd, vector<int>& postorder,int poStart,int poEnd)
    {
        if (inStart > inEnd)
        {
            return nullptr;
        }
        int rootVal = postorder[poEnd];
        int index = 0;
        for (int i = inStart; i <= inEnd; i++)
        {
            if (inorder[i] == rootVal)
            {
                index = i;
                break;
            }
        }
        int leftSize = index - inStart;
        TreeNode* root = new TreeNode(rootVal);
        root->left = buildHelp(inorder, inStart, index - 1,postorder, poStart, poStart + leftSize - 1);
        root->right = buildHelp(inorder, index + 1, inEnd,postorder, poStart + leftSize, poEnd - 1);
        return root;
    }
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值