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

剑指 Offer 07. 重建二叉树 C语言版

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

剑指 Offer 07. 重建二叉树 C语言版

文章目录

题目一、思路二、代码

三、 代码分析前序遍历的顺序是,根节点,左子树,右子树中序遍历的顺序是,左子树,根节点,右子树


题目

输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。

假设输入的前序遍历和中序遍历的结果中都不含重复的数字。

示例 1:

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

Input: preorder = [-1], inorder = [-1]
Output: [-1]

一、思路

关于树的问题,最多的解法就是分治法与递归法,这里采取分治法,我们对每个子树都去调用建立二叉树函数,实现产生整个树。

二、代码

代码如下:

struct TreeNode* buildTree(int* preorder, int preorderSize, int* inorder, int inorderSize){
    if(preorderSize==0)
        return NULL;
    struct TreeNode *root=(struct TreeNode*)malloc(sizeof(struct TreeNode));
    root->val=preorder[0];//前序遍历的第一个节点是根节点
    int i;
    for(i=0;ileft=buildTree(&preorder[1],i,&inorder[0],i);
    root->right=buildTree(&preorder[i+1],preorderSize-i-1,&inorder[i+1],preorderSize-i-1);
    return root;
}
三、 代码分析

首先要说明的是,前序遍历与中序遍历的特点

前序遍历的顺序是,根节点,左子树,右子树 中序遍历的顺序是,左子树,根节点,右子树

1.首先我们通过前序遍历得知根节点的值。
2.然后在中序遍历中,找到根节点的位置。
3.在中序遍历中,根节点之前即为左子树的中序遍历,之后为右子树的中序遍历。
4.通过子树长度,在前序遍历中划分出左子树的前序遍历,之后为右子树的前序遍历。

举例说明:

    for(i=0;i 

此时i = 1,即为左子树长度,右子树长度为 preorderSize - i - 1;
左子树的前序遍历为preorder[1]开始,长度为i
左子树的中序遍历为inorder[0]开始,长度为i
右子树的前序遍历为preorder[i+1]开始,长度为preorderSize - i - 1
右子树的中序遍历为inorder[i+1]开始,长度为preorderSize - i - 1

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/703264.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

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

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