二叉树札记 III 尝试写一棵静态的二叉查找树

Author: sandyzikun

如题。

C++
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
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>

using namespace std;

struct Node {
int val, parent, lchild, rchild;
Node() : val(-1), parent(-1), lchild(-1), rchild(-1) {}
} treenodes[3965];
int root = -1, num_nodes = 0;

inline int new_node(int _value) {
treenodes[num_nodes].val = _value;
return (num_nodes++);
}

void __preorder(int rt) {
if (~rt) {
printf(" %d,", treenodes[rt].val);
__preorder(treenodes[rt].lchild);
__preorder(treenodes[rt].rchild);
}
}
void __inorder(int rt) {
if (~rt) {
__inorder(treenodes[rt].lchild);
printf(" %d,", treenodes[rt].val);
__inorder(treenodes[rt].rchild);
}
}
inline void printall() {
__preorder(root); putchar('\n');
__inorder(root); putchar('\n');
}

int __search(int rt, int _target) {
if (!~rt)
return -1;
else if (_target == treenodes[rt].val)
return rt;
else {
if (_target < treenodes[rt].val)
return __search(treenodes[rt].lchild, _target);
else
return __search(treenodes[rt].rchild, _target);
}
} inline bool search(int _target) {
return ~__search(root, _target);
}

int __insert(int rt, int _value) {
if (!~rt)
return new_node(_value);
else {
if (treenodes[rt].val != _value) {
if (_value < treenodes[rt].val) {
treenodes[rt].lchild = __insert(treenodes[rt].lchild, _value);
treenodes[treenodes[rt].lchild].parent = rt;
} else {
treenodes[rt].rchild = __insert(treenodes[rt].rchild, _value);
treenodes[treenodes[rt].rchild].parent = rt;
}
}
return rt;
}
} inline void insert(int _value) {
root = __insert(root, _value);
}

int cur;

int main(int argc, char *argv[]) {
root = new_node(39);
printf("index_root=%d\nnum_nodes=%d\n", root, num_nodes);
printf("%d\n", treenodes[root].val);
printf("%d %d\n", search(39), search(128));
while (~scanf("%d", &cur))
insert(cur);
printall();
for (int k = 0; k != 10; ++k)
printf("%d\n", search(k));
return 0;
}
  • Sample #1

    • Input

      3 9 2 6 0 8 1 7
      
    • Output

      index_root=0
      num_nodes=1
      39
      1 0
       39, 3, 2, 0, 1, 9, 6, 8, 7,
       0, 1, 2, 3, 6, 7, 8, 9, 39,
      1
      1
      1
      1
      0
      0
      1
      1
      1
      1