栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

剑指offer-刷题笔记-中难题-JZ7 重建二叉树

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

剑指offer-刷题笔记-中难题-JZ7 重建二叉树

剑指offer-刷题笔记-中难题-JZ7 重建二叉树 注意:通过先序遍历和中序遍历可以确定二叉树, 通过中序遍历和后续遍历可以唯一确定二叉树,通过先序遍历和后序遍历确定不了二叉树。 1.通过先序遍历和中序遍历可以确定二叉树 算法:

1.通过先序遍历找到根节点A,再通过根节点在中序遍历的位置找出左子树,右子树
2.在A的左子树中,找出左子树的根节点(先序遍历),递归进入1
3.在A的右子树中,找出右子树的根节点(先序遍历),递归进入1

class Solution {
public:
    
    TreeNode* reConstructBinaryTree(vector pre,vector vin) {
        int n = pre.size();
        int m = vin.size();
        //两个遍历都不能为0
        if(n==0||m==0)
        {
            return nullptr; 
        }
        //构建根节点
        TreeNode *root = new TreeNode(pre[0]);
        for(int i = 0;i
            //找到中序遍历中的前序第一个元素
            if(pre[0] == vin[i])
            {
                //输入pre{1,2,4,7,3,5,6,8},vin{4,7,2,1,5,3,8,6}
                //满足条件i=3, 左子树前序遍历{2,4,7},
                //左子树的前序遍历
                vector leftpre(pre.begin() + 1, pre.begin() + i + 1);//注意尾指针指到后面一个
                //左子树的中序遍历
                vector leftvin(vin.begin(),vin.begin()+i);
                //构建左子树
                root->left = reConstructBinaryTree(leftpre,leftvin);
                //右子树的前序遍历
                vector rightpre(pre.begin()+i+1, pre.end());
                //右子树的中序遍历
                vector rightvin(vin.begin()+i+1,vin.end());
                root->right = reConstructBinaryTree(rightpre, rightvin);
                break;
            }
        }   
        return root; 
    }
};
2.通过中序遍历和后序遍历可以确定二叉树 算法:

1.通过后序遍历找到根节点A,再通过根节点在中序遍历的位置找出左子树,右子树
2.在A的左子树中,找出左子树的根节点(后序遍历),递归进入1
3.在A的右子树中,找出右子树的根节点(后序遍历),递归进入1

class Solution {
public:
    
    TreeNode* reConstructBinaryTree(vector post,vector vin) {
        int n = post.size();
        int m = vin.size();
        //两个遍历都不能为0
        if(n==0||m==0)
        {
            return nullptr; 
        }
        //构建根节点
        TreeNode *root = new TreeNode(post[post.size()-1]);
        for(int i = 0;i
            //找到中序遍历中的后序最后一个元素
            if(post[post.size()-1] == vin[i])
            {
                //输入post{7,4,2,5,8,6,3,1},vin{4,7,2,1,5,3,8,6}
                //满足条件i=3, 左子树后序遍历{7,4,2},
                //左子树的后序遍历
                vector leftpost(post.begin(), post.begin() + i);//注意尾指针指到后面一个
                //左子树的中序遍历
                vector leftvin(vin.begin(),vin.begin()+i);
                //构建左子树,
                root->left = reConstructBinaryTree(leftpost,leftvin);
                //右子树的后序遍历
                vector rightpost(post.begin()+i, post.end()-1);
                //右子树的中序遍历
                vector rightvin(vin.begin()+i+1,vin.end());
                root->right = reConstructBinaryTree(rightpost, rightvin);
                break;
            }
        }   
        return root; 
    }
};
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/832522.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号