【 LeetCode 105】 从前序与中序遍历序列构造二叉树 (中等)

代码:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
    
    
public:
    TreeNode* create(int zz,int zy,int xz,int xy,vector<int>& preorder, vector<int>& inorder) //zz中序左,zy中序右,xz先序左,xy先序右
    {
    
    
        if(xz>xy) return NULL; //空树
        TreeNode* root=new TreeNode; 
        root->val=preorder[xz]; //先序第一个为根
        int k;
        for(k=zz;k<=zy;k++) //在中序遍历中找到根,确定左右树的长度
            if(inorder[k]==preorder[xz]) break;
        
        int num=k-zz; //左子树的长度
        root->left=create(zz,zz+num-1,xz+1,xz+num,preorder,inorder); //建左树
        root->right=create(zz+num+1,zy,xz+num+1,xy,preorder,inorder); //建右树
        return root;
    }

    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
    
    
        TreeNode* root=create(0,inorder.size()-1,0,preorder.size()-1,preorder,inorder);
        return root;
    }
};

猜你喜欢

转载自blog.csdn.net/weixin_45260385/article/details/108437656