Leetcode 重构二叉树

题目描述

给出一棵树的中序遍历和后序遍历,请构造这颗二叉树

注意:

保证给出的树中不存在重复的节点

 

思路:后序遍历的最后一个元素是root 

根据这个在中序遍历中可以划分左右子树的中序序列

并根据长度划分后序遍历的左右子树序列

子问题递归继续递归实现即可

 TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
        // write code here
        int size=inorder.size();//序列长度
        if(size==0)
            return NULL;//特殊情况
        int root=postorder[size-1];//后序遍历最后一个元素是根节点
        //依据根节点划分  中序遍历前后部分
        vector<int> inorder_left;
        int i=0;
        while(inorder[i]!=root)
        {
            inorder_left.push_back(inorder[i]);
            i++;
        }
        int left_size=i;
        vector<int> inorder_right;
        i++;
        while(i<size)
        {
            inorder_right.push_back(inorder[i]);
            i++;
        }
        vector<int> postorder_left;
        vector<int> postorder_right;
        for(int i=0;i<left_size;i++)
            postorder_left.push_back(postorder[i]);
        for(int i=left_size;i<size-1;i++)
            postorder_right.push_back(postorder[i]);
        TreeNode* p_root=new TreeNode(root);
        p_root->left=buildTree(inorder_left,postorder_left);
        p_root->right=buildTree(inorder_right,postorder_right);  
        return p_root; 
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值