二叉树是每个结点最多有两个子树的有序树。通常子树的根被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用作
二叉查找树
和二叉堆或是二叉排序树。二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒。
二叉树的遍历包括深度优先和宽度优先,深度优先又有前序,中序遍历和后序遍历三种。
对于深度优先遍历,递归遍历方法直观而简洁,如果要使用非递归方法,一般要借用栈结构;
宽度优先则常使用队列来实现。
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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
|
#include
using namespace std;
template
class
TreeNode
{
protected
:
TreeNode* left;
TreeNode* right;
public
:
T data;
TreeNode (
const
T& item,TreeNode *lptr,TreeNode *rptr):
data(item),left(lptr),right(rptr) {}
virtual ~TreeNode() {}
TreeNode* Left()
const
{
return
left;
}
TreeNode* Right()
{
right;
}
//递归遍历
void
Preorder(TreeNode *
node )
;
Inorder(TreeNode *
;
Postorder(TreeNode *
node)
const
;
Preorder() {
Preorder(
this
);
}
Inorder() {
);
}
Postorder() {
);
}
//非递归遍历
PreTraverse(TreeNode *
;
InTraverse(TreeNode *
;
PostTraverse(TreeNode *
;
PreTraverse() {
PreTraverse(
);
}
InTraverse() {
InTraverse(
);
}
PostTraverse() {
PostTraverse(
);
}
};
// preorder recursive scan of the nodes in a tree
template
TreeNode::Preorder (TreeNode *
t)
const
{
if
(t != NULL) {
cout << t->data <<
" "
;
// visit the node
Preorder (t->Left());
// descend left
Preorder (t->Right());
// descend right
}
}
// inorder recursive scan of the nodes in a tree
template
TreeNode::Inorder (TreeNode*
const
{
(t != NULL) {
Inorder (t->Left());
// descend left
;
// visit the node
Inorder (t->Right());
// descend right
}
}
// postorder recursive scan of the nodes in a tree
template
TreeNode::Postorder (TreeNode *
const
{
(t != NULL) {
Postorder (t->Left());
// descend left
Postorder(t->Right());
// descend right
// visit the node
}
}
template
TreeNode::PreTraverse(TreeNode *
node )
const
{
(node == NULL)
return
;
TreeNode *t = node;
stack< TreeNode* > s;
s.push(t);
while
(! s.empty()) {
t = s.top();
s.pop();
;
if
(t->right != NULL)
s.push(t->right);
(t->left != NULL)
s.push(t->left);
}
}
template
TreeNode::InTraverse(TreeNode *
const
{
(node == NULL)
;
TreeNode *t = node;
stack< TreeNode* > s;
do
{
while
(t != NULL) {
s.push(t);
t = t->left;
}
t = s.top();
s.pop();
;
t = t->right;
}
(!s.empty()|| t!=NULL);
}
template
TreeNode::PostTraverse(TreeNode *
const
{
stack<TreeNode* > s;
stack sf;
TreeNode *t = node;
int
flag;
(!s.empty() || t!=NULL){
(t!=NULL){
s.push(t);
sf.push(
0
);
t = t->left;
}
t = s.top(),s.pop();
flag = sf.top(),sf.pop();
(flag ==
) {
s.push(t);
1
);
t = t->right;
}
else
{
;
t = NULL;
}
}
}一个简单的测试程序
|
1
int main()
2 {
3 TreeNode< int> n1( 10,NULL,NULL);
4 TreeNode< int> n2( 9,128); line-height:1.5!important"> 5 TreeNode< int> n3( 6,&n1,&n2);
6 TreeNode< int> n4( 7,128); line-height:1.5!important"> 7 TreeNode< int> n5( 8,128); line-height:1.5!important"> 8 TreeNode< int> n6( 3,&n4,&n5);
9 TreeNode< int> n7( 1,&n3,&n6);
10
11 n7.PreTraverse(); cout << endl;
12 n7.InTraverse(); cout << endl;
13 n7.PostTraverse();cout << endl;
14
15 system( " pause ");
16 return 0;
17 }
2 {
3 TreeNode< int> n1( 10,NULL,NULL);
4 TreeNode< int> n2( 9,128); line-height:1.5!important"> 5 TreeNode< int> n3( 6,&n1,&n2);
6 TreeNode< int> n4( 7,128); line-height:1.5!important"> 7 TreeNode< int> n5( 8,128); line-height:1.5!important"> 8 TreeNode< int> n6( 3,&n4,&n5);
9 TreeNode< int> n7( 1,&n3,&n6);
10
11 n7.PreTraverse(); cout << endl;
12 n7.InTraverse(); cout << endl;
13 n7.PostTraverse();cout << endl;
14
15 system( " pause ");
16 return 0;
17 }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。