Leetcode 105.从前序与中序遍历序列

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

难度中等

给定一棵树的前序遍历 preorder 与中序遍历  inorder。请构造二叉树并返回其根节点。

示例 1:

Input: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
Output: [3,9,20,null,null,15,7]

注释写满了心路历程,应该算比较详细?

class Solution {
public:
    TreeNode* bulidTreePoint(vector<int> &preorder,int preL,int preR,vector<int> &inorder,int inoL,int inoR){//preL~preR固定为某树的前序遍历,inoL~inoR固定为某树的中序遍历
        if(preL>preR||inoL>inoR){
            return nullptr;
        }
        int rootval=preorder[preL];
        int midd=find(inorder.begin(),inorder.end(),rootval)-inorder.begin();//midd的序号代表了什么?(1)根节点的序号(2)左子树结点数量=序号(在0开头的时候)
        TreeNode* s=new TreeNode(rootval);
        s->left=bulidTreePoint(preorder,preL+1,preL+midd-inoL,inorder,inoL,midd-1);//这里的inoL意味着什么?或者说midd-inoL意味着左子树结点数!inoL是左子树的开头,midd是根节点的位置,已知中序遍历的结构为[[left]root[right]],根节点的序号和整个中序遍历头的序号中间的数量就是左子树结点数;
        s->right=bulidTreePoint(preorder,preL+midd-inoL+1,preR,inorder,midd+1,inoR);
        return s;
    }
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        return bulidTreePoint(preorder, 0, preorder.size() - 1, inorder, 0, inorder.size() - 1);
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值