-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathRebuildBinaryTree.h
More file actions
102 lines (82 loc) · 1.74 KB
/
RebuildBinaryTree.h
File metadata and controls
102 lines (82 loc) · 1.74 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#define _CRT_SECURE_NO_DEPRECATE
#include<iostream>
using namespace std;
struct BinaryTreeNode
{
int _value;
BinaryTreeNode *_left;
BinaryTreeNode *_right;
BinaryTreeNode(const int value)
:_value(value)
, _left(NULL)
, _right(NULL)
{
}
};
typedef BinaryTreeNode Node;
BinaryTreeNode * ConstructCore(int *startPrevOrder, int *endPrevOrder,
int *startInOrder, int *endInOrder)
{
int value = startPrevOrder[0];
Node *root = new Node(value);
if (startPrevOrder == endPrevOrder)
{
if (startInOrder == endInOrder && *startPrevOrder == *startInOrder)
{
return root;
}
else
{
cout << "遍历有错" << endl;
return NULL;
}
}
//在中序中找根节点
int *rootInOder = startInOrder;
while (rootInOder <= endInOrder)
{
if (*rootInOder == value)
{
break;
}
++rootInOder;
}
if (rootInOder == endInOrder && *rootInOder != value)
{
cout << "序列出错" << endl;
return NULL;
}
int leftLength = rootInOder - startInOrder;
if (leftLength > 0)
{
root->_left = ConstructCore(startPrevOrder + 1, startPrevOrder + leftLength, startInOrder, rootInOder - 1);
}
if (leftLength < (endPrevOrder - startPrevOrder))
{
root->_right = ConstructCore(startPrevOrder + leftLength + 1, endPrevOrder, rootInOder + 1, endInOrder);
}
return root;
}
Node *Construct(int *prevOrder, int *InOrder, int len)
{
if (prevOrder == NULL || InOrder == NULL || len < 0)
return NULL;
return ConstructCore(prevOrder, prevOrder + len -1, InOrder, InOrder + len -1);
}
void InOrder(Node *root)
{
if (root == NULL)
{
return;
}
InOrder(root->_left);
cout << root->_value << " ";
InOrder(root->_right);
}
void TestReBuild()
{
int prev[] = {1,2,4,7,3,5,6,8};
int In[] = {4,7,2,1,5,3,8,6};
Node *root = Construct(prev, In, 8);
InOrder(root);
}