[Jobdu]题目1385:重建二叉树

根据一棵二叉树的先序遍历和后序遍历,重建二叉树

例子:

我们先来看一个例子,二叉树如上图,则先序遍历为:1 2 4 7 3 5 6 8,中序遍历为:4 7 2 1 5 3 8 6

思路:

先序遍历中的第一个元素为根节点,这个元素将中序遍历划分为左右两个部分,左边的为左子树的中序遍历,右边的为右子树的中序遍历,同样也可以将先序遍历除了第一个元素以外的划分为两个部分,第一个部分是左子树的先序遍历,第二部分是右子树的先序遍历。

由此可知,这是一个递归过程,可以利用递归函数来构建二叉树。对于二叉树的这种常见操作要熟悉,实现的代码要会写。

代码:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3
 4 // the binary tree node
 5 typedef struct BTNode{
 6     int key;
 7     struct BTNode *lchild;
 8     struct BTNode *rchild;
 9 }BTNode;
10
11 // find the key in the InOrder array, if not finded then return -1
12 int findKey(int arr[], int start, int end, int key) {
13     int i;
14     for (i = start; i <= end; i++)
15         if (arr[i] == key)
16             return i;
17     return -1;
18 }
19
20 // create the binary tree by PreOrder and InOrder
21 BTNode *rebuildTree(int pre[], int startPre, int endPre, int in[], int startIn, int endIn) {
22     // both order have the same size
23     if (endPre - startPre != endIn - startIn)
24         return NULL;
25     // the root is the first node of PreOrder
26     BTNode *root = (BTNode *) malloc(sizeof(BTNode));
27     root->key = pre[startPre];
28     root->lchild = NULL;
29     root->rchild = NULL;
30
31     // find the index of root node in the InOrder
32     int mid = findKey(in, startIn, endIn, pre[startPre]);
33     if (mid == -1)
34         return NULL;
35
36     // if the left-subtree exists, create left-subtree
37     int length;
38     if (mid > startIn) {
39         length = mid - startIn;
40         root->lchild = rebuildTree(pre, startPre + 1, startPre + 1 + length - 1, in, startIn, startIn + length - 1);
41     }
42
43     // if the right-subtree exists, create right-subtree
44     if (mid < endIn) {
45         length = endIn - mid;
46         root->rchild = rebuildTree(pre, endPre - length + 1, endPre, in, endIn - length + 1, endIn);
47     }
48
49     return root;
50 }
51
52 void postTraverse(BTNode *tree) {
53     if (tree) {
54         postOrder(tree->lchild);
55         postOrder(tree->rchild);
56         printf("%d ", tree->key);
57     }
58 }
59
60 int main() {
61     int preOrder[8] = {1, 2, 4, 7, 3, 5, 6, 8};
62     int inOrder[8] = {4, 7, 2, 1, 5, 3, 8, 6};
63     BTNode *root = rebuildTree(preOrder, 0, 7, inOrder, 0, 7);
64     postTraverse(root);
65     printf("\n");
66
67     return 0;
68 }
时间: 2024-12-22 13:25:27

[Jobdu]题目1385:重建二叉树的相关文章

[Jobdu]题目1521:二叉树的镜像

不知道怎么回事下面的代码通过了4个测试用例,还有1个测试用例始终是Runtime Error,各位帮我看一下是哪里出了问题 镜像输出两种方法,一种是递归进行调整,另外一种就是直接在先序遍历的基础上进行改造,下面代码中实现的是第二种 1 #include <cstdio> 2 #include <cstdlib> 3 4 typedef struct BTNode{ 5 int key; 6 struct BTNode *lchild; 7 struct BTNode *rchild

[剑指offer]8.重建二叉树

题目 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并输出它的后序遍历序列. 代码 /*--------------------------------------- * 日期:2015-07-20 * 作者:SJF0115 * 题目: 8.重建二叉树 * 结果:AC * 网址:http://www.nowcoder

九度oj题目1385:重建二叉树

题目1385:重建二叉树 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:4419 解决:1311 题目描述: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并输出它的后序遍历序列. 输入: 输入可能包含多个测试样例,对于每个测试案例, 输入的第一行为一个整数n(1<=n<=1000):代表二叉树的节点个

题目六:重建二叉树

/////////////////////////////////////////////////////////////////////////////////////// // // 9.题目六:重建二叉树 // 题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出改二叉树 struct BinaryTreeNode { int m_iValue; BinaryTreeNode* m_pLeft; BinaryTreeNode* m_pRight; BinaryTreeNode(int i

027依据前序遍历和中序遍历,重建二叉树(keep it up)

剑指offer中题目:http://ac.jobdu.com/problem.php?pid=1385 题目描写叙述: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.如果输入的前序遍历和中序遍历的结果中都不含反复的数字. 比如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并输出它的后序遍历序列. 输入: 输入可能包括多个測试例子,对于每一个測试案例, 输入的第一行为一个整数n(1<=n<=1000):代表二叉树的节点

重建二叉树_C++

一.题目背景 给定一个二叉树的前序和中序遍历,求出它的后序遍历 二叉树的遍历可参考 http://blog.csdn.net/fansongy/article/details/6798278/ 二.算法分析 例如下面这个二叉树 它的先序遍历为:DBACEGF 它的中序遍历为:ABCDEFG 它的后序遍历为:ACBFGED 先用一个指针指向先序遍历第一个字符,即树的根节点D 然后在中序遍历找到D,将此遍历划分为ABC和EFG,因为中序遍历按照左中右的结构,可知在D左边为其左子树,右边为其右子树 进

剑指OFFER之重建二叉树

题目描述: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并输出它的后序遍历序列. 输入: 输入可能包含多个测试样例,对于每个测试案例, 输入的第一行为一个整数n(1<=n<=1000):代表二叉树的节点个数. 输入的第二行包括n个整数(其中每个元素a的范围为(1<=a<=1000)):代表二叉树的前序

剑指offer系列源码-重建二叉树

oj地址 </pre><p><pre name="code" class="html">题目1385:重建二叉树 时间限制:1 秒内存限制:32 兆特殊判题:否提交:3609解决:1091 题目描述: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并输

根据二叉树的前序遍历和中序遍历重建二叉树

题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回. 1 /** 2 * Definition for binary tree 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode(