码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-08-05 21:52:29      阅读:174      评论:0      收藏:0      [点我收藏+]

标签:

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

 

例子:

技术分享

我们先来看一个例子,二叉树如上图,则先序遍历为: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 }

 

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

标签:

原文地址:http://www.cnblogs.com/tonyhu1993/p/4705800.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!