剑指 Offer 07. 重建二叉树

简单说两句

CSDN个人主页:后端小知识

🔎GZH后端小知识

🎉欢迎关注🔎点赞👍收藏⭐️留言📝

Hello吖,各位小伙伴好久不见,十分想念,已经有一段时间没有更新博客了,具体原因嘛(放在文末)

题目: 剑指 Offer 07. 重建二叉树 ,我们今天来看一道递归的题目吧,这是选自剑指Offer上的一道题,好了,我们一起来看看题意吧:

考虑到直接复制题目,或者截屏的方式不是很方便阅读,我就把直接题目链接放下面!
题目传送门: 剑指 Offer 07. 重建二叉树

image-20230205185331844

思路:

可以先看看代码(有注释的),然后再来看看这个思路

本题的一个难点就是:找到左右子树在前序和中序遍历序列中对应的区间

前序序列取得根节点序列第一个),然后在中序序列中找到根节点的位置记为pos,

中序序列pos左边的则为左子树,对应数量为 pos - 中序序列起始位置(inStart) ,

将中序序列pos左边的节点数量记录为x,x = pos - inStart

二叉树的左子树在前序序列中的区间为:preStart(前序序列中的第一个位置)+1preStart+x,在中序序列中的位置为inStart(中序序列中的第一个位置)到pos-1

二叉树的右子树在前序序列中的区间为:preStart+x+1,到preEnd(前序序列的最后一个位置),在中序序列中的位置为pos+1inEnd(中序序列中的最后一个位置)

递归处理以上步骤

我们来看看成功AC的代码吧:

class Solution {
    vector<int> pre,in;
public:
    TreeNode* dfs(int preStart,int preEnd,int inStart,int inEnd){
        if(preStart>preEnd||inStart>inEnd) return NULL;
        //前序遍历中的开始节点就是根节点,取出根节点值
        int t = pre[preStart];
        //寻找子树的根节点在中序序列中的哪个位置
        int pos;
        for(int i=0;i<in.size()-1;i++){ if(in[i]==t){ pos = i; break; }}
        auto s = new TreeNode(t);
        //【pos-inStart】为左子树中的节点数
        int x = pos - inStart;
        //递归构建左子树,并连上根节点
        //前序遍历中的区间【preStart+1,preStart+x】,中序遍历中的区间【inStart,pos-1】
        s->left = dfs(preStart+1,preStart+x,inStart,pos-1);
        //递归构建右子树,并连上根节点
        //前序遍历中的区间【preStart+1+x,preEnd】,中序遍历中的区间【pos+1,inEnd】
        s->right = dfs(preStart+1+x,preEnd,pos+1,inEnd);
        return s;
    }
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        pre = preorder; in = inorder;
        return dfs(0,pre.size()-1,0,in.size()-1);
    }
};

💬

哈哈哈,简单说一下前面说的情况额,我就用一句来说明,读孙子兵法,品启强人生😎懂了吧🤪

今天刚好也是元宵节,祝大家元宵快乐,2023一路狂飙😊

结语

谢谢你的阅读,由于作者水平有限,难免有不足之处,若读者发现问题,还请批评,在留言区留言或者私信告知,我一定会尽快修改的。若各位大佬有什么好的解法,或者有意义的解法都可以在评论区展示额,万分谢谢。
写作不易,望各位老板点点赞,加个关注!

CSDN个人主页:后端小知识

🔎GZH后端小知识

🎉欢迎关注🔎点赞👍收藏⭐️留言📝

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不正经小新

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值