编程--重建二叉树

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。

/**
 * 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* reConstructBinaryTree(vector<int> pre,vector<int> vin) {
        //输入合法性判断,不能为空,长度大于0;
        if(pre.empty()||vin.empty()){
            return NULL;
        }
        int rootValue=pre[0];//根节点为前序的第一个数;
       // int index=vin.start();//定义一个下标,指向中序的开始位置;
         TreeNode* root=new TreeNode(rootValue);//创建当前根节点,并为根节点赋值
        int leftlen=0;
        int rightlen=0;
        
        //在中序序列中找到根节点的位置(必存在)
        for (int i = 0; i < vin.size(); i++){
            if (vin[i] == rootValue){
                leftlen= i;//左子树的长度为i;
                rightlen = vin.size() - i - 1;//右子树的长度
                break;
            }
        }
        //中序的左边为左子树中序序列,右边为右子树中序序列;
        //前序的[startpre+1,leftlen]为左子树,[leftlen+1,endpre]为右子树;
        vector<int> leftPre (pre.begin() + 1, pre.begin() +1 + leftlen);
        vector<int> leftIn (vin.begin(), vin.begin() + leftlen);
        vector<int> rightPre (pre.begin() + leftlen + 1, pre.begin() + leftlen + 1 + rightlen);
        vector<int> rightIn (vin.begin() + leftlen + 1, vin.begin() + leftlen + 1 + rightlen);
        
        //递归构建左右子树
        root->left = reConstructBinaryTree(leftPre, leftIn);
        root->right = reConstructBinaryTree(rightPre, rightIn);
        return root;

    }
};

根据中序和后序重建二叉树(和前序中序重建思路差不多):

/**
 * 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<int> &inorder, vector<int> &postorder) {
        if(inorder.empty()||postorder.empty()){
            return NULL;
        }
        
        int rootValue=postorder[postorder.size()-1];
        int leftlen=0;
        int rightlen=0;
        TreeNode* root=new TreeNode(rootValue);
        
        for(int i=0;i<inorder.size();i++){
            if(inorder[i]==rootValue){
                leftlen=i;
                rightlen=inorder.size()-i-1;
                break;
            }
        }
        
        vector<int>leftIn(inorder.begin(),inorder.begin()+leftlen);
        vector<int>rightIn(inorder.begin()+leftlen+1,inorder.begin()+leftlen+1+rightlen);
        vector<int>leftPost(postorder.begin(),postorder.begin()+leftlen);
        vector<int>rightPost(postorder.begin()+leftlen,postorder.begin()+leftlen+rightlen);
        
        root->left=buildTree(leftIn,leftPost);
        root->right=buildTree(rightIn,rightPost);
        return root;
    }
};

猜你喜欢

转载自blog.csdn.net/snowyuuu/article/details/81700708