重建二叉树

本文探讨了根据不同遍历序列(前序、中序、后序)重建二叉树的方法,包括前序和中序序列、后序和中序序列、前序和后序序列的构建策略。此外,还介绍了二叉树的序列化和反序列化过程,强调了正确处理重复节点值和空节点的重要性。
摘要由CSDN通过智能技术生成

1,前序和中序序列构造二叉树

来源:105. 从前序与中序遍历序列构造二叉树  &&  剑指 Offer 07. 重建二叉树

思路:前序序列的第一个数字即为树根节点,中序遍历中找到该数字,将中序序列一分为二,左侧数字组成左子树,右侧组成右子树。依次类推。

class Solution {
public:
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        return create(preorder, 0, preorder.size() - 1, inorder, 0, inorder.size() - 1);
    }
    TreeNode* create(const vector<int>& preorder, int s1, int e1, const vector<int>& inorder, int s2, int e2) {
        if (s1 > e1) return NULL;
        // 在inorder中找到preorder[s1],将inorder一分为二,左侧个数:p-s2
        int p = s2;
        while (inorder[p] != preorder[s1]) {
            p++;
        }

        TreeNode *ret = new TreeNode(preorder[s1]);
        ret->left = create(preorder, s1+1, s1+p-s2, inorder, s2, p-1);
        ret->right = create(preorder, s1+p-s2+1, e1, inorder, p+1, e2);
        return ret;
    }
};

2,后序和中序序列构造二叉树

来源:106. 从中序与后序遍历序列构造二叉树

思路:与题1相似。后序序列最后一个数字为根节点。

class Solution {
public:
    TreeNode* buildT
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值