天天看点

根据前序遍历和中序遍历重新构建二叉树

基本思想就是在前序遍历中找第一节点,就是根节点,然后在中序遍历中找到该节点,左边的部分就是左子树,右边的部分就是右子树,然后递归调用该函数,构建左子树和右子树。

需要注意的一点是当以vector做参数的时候,递归调用的时候需要重新构建vector,如果是指针的话可以通过指针的加减来进行操作。

代码如下:

class Solution {

public:

    TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {

        int n=pre.size();

        if(n<=0)

            return NULL;

        TreeNode* newnode=new TreeNode(pre[0]);

        int i=0;

        for(;i<vin.size();i++)

        {

            if(vin[i]==pre[0])

                break;

        }

        vector<int> pre_left;

        vector<int> in_left;

        vector<int> pre_right;

        vector<int> in_right;

        for(int j=0;j<n;j++)

        {

            if(j<i)

            {

                pre_left.push_back(pre[j+1]);//除去根节点

                in_left.push_back(vin[j]);

            }

            else if(j>i)

            {

                pre_right.push_back(pre[j]);

                in_right.push_back(vin[j]);

            }

        }

        newnode->left=reConstructBinaryTree(pre_left,in_left);

        newnode->right=reConstructBinaryTree(pre_right,in_right);

        return newnode;

    }

};

继续阅读