首页 > 代码库 > 【剑指offer】重建二叉树
【剑指offer】重建二叉树
题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建出图2.6所示的二叉树并输出它的头结点。二叉树结点的定义如下:
struct TreeNode{ ElemType data; TreeNode*left; TreeNode*right; };
分析:前序遍历的第一个数1就是根结点,中序遍历中1之前的数组成了左子树,也就是4,7,2是左子树,1之后的数组成了右子树,也就是3,8,6是右子树。对于前序遍历的2,4,7同样仍然是前序遍历,因此,重建整个数就可以分解成重建左子树和重建右子树。左子树的前序遍历是2,4,7,中序遍历是4,7,2。依次类推……因此我们可以用递归的方法解决此问题。
程序示例:
#include <stdio.h> #include <stdlib.h> #include <memory.h> typedef int ElemType; typedef struct TreeNode{ ElemType data; struct TreeNode *left; struct TreeNode *right; }TreeNode, *pTreeNode; pTreeNode ConstructCore (int *startPreorder, int *endPreorder, int *startInorder, int *endInorder) { int rootValue = http://www.mamicode.com/startPreorder[0];>
总结:1、对于树的三种遍历,要牢牢的掌握。
2、分析复杂问题时千万不要怕麻烦,以后遇到的问题肯定都不是一眼就能看出结果的,如果有思路,不要怕麻烦而不去实现它,切记!
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。