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

剑指Offer——重建二叉树(C语言)

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

剑指Offer——重建二叉树(C语言)

题目

输入一棵二叉树前序遍历和中序遍历的结果,请重建该二叉树。

注意:

  • 二叉树中每个节点的值都互不相同;
  • 输入的前序遍历和中序遍历一定合法;

数据范围

书中节点数量范围 [0,100][0,100]。

样哩

给定:
前序遍历是:[3, 9, 20, 15, 7]
中序遍历是:[9, 3, 15, 20, 7]

返回:[3, 9, 20, null, null, 15, 7, null, null, null, null]
返回的二叉树如下所示:
    3
   / 
  9  20
    /  
   15   7

思路:

先理清用前序+中序得出二叉树的过程,再运用递归方法 

找到每个子树的根节点,再分出左子树和右子树(用数组表示出来),然后运用递归建立root->left和root->right

tip:遍历数组为空的情况,返回NULL

代码

struct TreeNode {
     int val;
     struct TreeNode *left;
     struct TreeNode *right;
};

struct TreeNode* buildTree(int* preorder, int preorder_size, int* inorder, int inorder_size) {
    if(preorder == NULL || inorder == NULL) return NULL; 
    if(preorder_size == 0 || inorder_size == 0) return NULL; //用以保证数组为空时输出NUll    
    int rootval = preorder[0];
    struct TreeNode *root = (struct TreeNode *)malloc(sizeof(struct TreeNode *));
    root->val=rootval;

    int i=0,j=0;
    int pos=0;   //根节点在中序序列中的位置

    if(preorder_size == 1) return root;    //如果只剩一个结点,直接返回

    //确定pos
    for(i=0;i0)
        root->left = buildTree(Left_pre,len1,Left_order,len1);      
    if(posright = buildTree(Right_pre,len2,Right_order,len2);

    return root;
}

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

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

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