105. 从前序与中序遍历序列构造二叉树

思路

  1. 呜呜呜笨蛋把前序遍历层次遍历搞错了?
  2. 题目不难,细心即可。
  3. 根据前序遍历的第一个元素取中序遍历中找将树分成两个部分,不断的递归就好啦,详细的看代码。

代码

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        int pn=preorder.size();
        int n=inorder.size();
        TreeNode* root=solve(0,0,n-1,preorder,inorder);
        return root;
    }

    TreeNode* solve(int i,int k,int m,vector<int>&preorder,vector<int>&inorder){
        // 中序遍历只有一个元素,那么k==m
        if(k==m){
            TreeNode*node =new TreeNode(inorder[k],NULL,NULL);
            return node;
        }
        // 不可能只有一个元素
        int pos=find(k,m,preorder[i],preorder,inorder);
        // 需要根据pos左右是否还有元素决定是否有左右子节点
        if(pos!=-1){
            // 注意要加上这两个if判断
            TreeNode*left=NULL;
            if(pos>k){// 还有左节点
                left=solve(i+1,k,pos-1,preorder,inorder);
            }
            TreeNode*right=NULL;
            if(pos<m){// 还有右节点
                right=solve(i+pos-k+1,pos+1,m,preorder,inorder);
            }
            TreeNode*root=new TreeNode(preorder[i],left,right);
            return root;
        }
        return NULL;
    }

    int find(int k,int m,int preorder_,vector<int>&preorder,vector<int>&inorder){
        // if(k==m){
        //     return k;
        // }
        for(int pos=k;pos<=m;pos++){
            if(inorder[pos]==preorder_){
                return pos;
            }
        }
        return -1;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值