力扣精选top面试题-------从前序与中序遍历序列构造二叉树

在这里插入图片描述
题目链接

思路:
这道题的思路是很明确的,我们都知道前序的第一个节点就是当前的根节点,然后用这个根节点x在中序数组上进行分割,因为在中序数组x元素的左边是左子树,右边是右子树;最后就是循环递归即可。

代码:

/**
 * 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:
    typedef vector<int>::iterator Iterator;
    TreeNode* dfs(Iterator it1,int len1,Iterator it2,int len2){
    
    

        int now = (*it1);
        TreeNode* root = new TreeNode(now);
        if(len1==1) return root;
        Iterator bk = it2;
        int i=1;
        while(i<=len2){
    
    
            if((*bk)==now) break;
            ++i;
            ++bk;
        }
        if(i-1>=1) root->left = dfs(it1+1,i-1,it2,i-1);
        if(len2-i>=1) root->right = dfs(it1+i,len2-i,++bk,len2-i);
        return root;
    } 
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
    
    
        if(preorder.size() == 0 || inorder.size()==0) return 0;
        return dfs(preorder.begin(),preorder.size(),inorder.begin(),inorder.size());
    }
};

猜你喜欢

转载自blog.csdn.net/weixin_43743711/article/details/114535066