构造二叉树

文章介绍了如何通过后序遍历的特性(最后一个元素为根节点)和中序遍历找到根节点,然后递归地分割左右子树,实现二叉树的构建。Solution类中的buildTree方法实现了这一过程。
摘要由CSDN通过智能技术生成

1.后序遍历的最后一个一定是根节点

2.去中序找这个根节点,找到之后左右两边一下子就把左子树和右子树找到了

3.就可以又在后序遍历里切割

4.后序遍历里左右子树,如果比较长,那么最后一个值一定是该节点的根节点

5.会一直从左子树进去,每次的leftinorder rightorder leftposorder rightposorder都会改变,返回上一层之后又改变了

class Solution {
    private:
    TreeNode *travelsal(vector<int>& inorder, vector<int>& postorder){
        if(postorder.size()==0)return NULL;

        int posvalue=postorder[postorder.size()-1];

        TreeNode *root=new TreeNode(posvalue);
        if(postorder.size()==1)return root;

        int i;
        for( i=0;i<inorder.size();i++){
            if(inorder[i]==posvalue)break;
        }

        vector<int>leftinorder(inorder.begin(),inorder.begin()+i);
        vector<int>rightinorder(inorder.begin()+i+1,inorder.end());

        postorder.resize(postorder.size()-1);

        vector<int>leftposorder(postorder.begin(),postorder.begin()+leftinorder.size());
        vector<int>rightposorder(postorder.begin()+leftinorder.size(),postorder.end());

        root->left=travelsal(leftinorder,leftposorder);
        root->right=travelsal(rightinorder,rightposorder);
        return root;
    }
public:
    TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
        if(!inorder.size()||!postorder.size())return NULL;
        return travelsal(inorder,postorder);
    }
};

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值