遍歷命名
遍歷算法
中序算法實現
中序投影法
層序遍歷
前序遍歷
1
2
3
4
5
6
7
8
9
10
11
|
procedure first(i: longint ); begin write (a[i]); ifa[i* 2 ]<>0then first(i* 2 ); ifa[i* 2 + 1 ]<>0then first(i* 2 + 1 ); end ; |
中序遍歷
1
2
3
4
5
6
7
8
9
10
11
|
procedure mid(i: longint ); begin if a[i* 2 ]<> 0 then mid(i* 2 ); write (a[i]); if a[i* 2 + 1 ]<> 0 then mid(i* 2 + 1 ); end ; |
後序遍歷
1
2
3
4
5
6
7
8
9
10
11
|
procedure last(i: longint ); begin if a[i* 2 ]<> 0 then last(i* 2 ); if a[i* 2 + 1 ]<> 0 then last(i* 2 + 1 ); write (a[i]); end ; |
注意事項
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
|
#include<iostream> #include<cstdio> #include<cmath> #include<iomanip> #include<cstdlib> #include<ctime> #include<algorithm> #include<cstring> #include<string> #include<vector> #include<list> #include<stack> #include<queue> #include<map> #include<set> using namespace std; typedef int T; class bst { struct Node { T data; Node* L; Node* R; Node( const T& d,Node* lp=NULL,Node* rp=NULL):data(d),L(lp),R(rp) {} }; Node* root; int num; public : bst():root(NULL),num(0) {} void clear(Node* t) { if (t==NULL) return ; clear(t->L); clear(t->R); delete t; } ~bst() { clear(root); } void clear() { clear(root); num = 0; root = NULL; } bool empty() { return root==NULL; } int size() { return num; } T getRoot() { if (empty()) throw "empty tree" ; return root->data; } void travel(Node* tree) { if (tree==NULL) return ; travel(tree->L); cout << tree->data << ' ' ; travel(tree->R); } void travel() { travel(root); cout << endl; } int height(Node* tree) { if (tree==NULL) return 0; int lh = height(tree->L); int rh = height(tree->R); return 1+(lh>rh?lh:rh); } int height() { return height(root); } void insert(Node*& tree, const T& d) { if (tree==NULL) tree = new Node(d); else if (ddata) insert(tree->L,d); else insert(tree->R,d); } void insert( const T& d) { insert(root,d); num++; } Node*& find(Node*& tree, const T& d) { if (tree==NULL) return tree; if (tree->data==d) return tree; if (ddata) return find(tree->L,d); else return find(tree->R,d); } bool find( const T& d) { return find(root,d)!=NULL; } bool erase( const T& d) { Node*& pt = find(root,d); if (pt==NULL) return false ; combine(pt->L,pt->R); Node* p = pt; pt = pt->R; delete p; num--; return true ; } void combine(Node* lc,Node*& rc) { if (lc==NULL) return ; if (rc==NULL) rc = lc; else combine(lc,rc->L); } bool update( const T& od, const T& nd) { Node* p = find(root,od); if (p==NULL) return false ; erase(od); insert(nd); return true ; } }; int main() { bst b; cout << "input some integers:" ; for (;;) { int n; cin >> n; b.insert(n); if (cin.peek()== '\n' ) break ; } for (;;) { cout << "input data pair:" ; int od,nd; cin >> od >> nd; if (od==-1&&nd==-1) break ; b.update(od,nd); } } |