1
+ <?php
2
+ /**
3
+ * 二叉搜索树
4
+ *
5
+ * 二叉搜索树或者是一棵空树,或者是具有下列性质的二叉树:
6
+ * 1.每个结点都有一个作为搜索依据的关键码(value),所有结点的关键码互不相同。
7
+ * 2.左子树(如果非空)上所有结点的关键码都小于根结点的关键码。
8
+ * 3.右子树(如果非空)上所有结点的关键码都大于根结点的关键码。
9
+ * 4.左子树和右子树也是二叉搜索树。
10
+ *
11
+ * class Node {
12
+ * public $value;
13
+ * public $left = null;
14
+ * public $right = null;
15
+ * }
16
+ */
17
+ class BinarySearchTree
18
+ {
19
+ /**
20
+ * @var $root 根节点
21
+ */
22
+ public $ root = null ;
23
+
24
+ /**
25
+ * 创建新节点
26
+ * @param $data 关键码
27
+ */
28
+ protected function createNode ($ data )
29
+ {
30
+ $ node = new stdClass ();
31
+ $ node ->value = $ data ;
32
+ $ node ->left = null ;
33
+ $ node ->right = null ;
34
+ return $ node ;
35
+ }
36
+
37
+
38
+ /**
39
+ * 插入节点
40
+ * @param $node 根节点
41
+ * @param $value 关键值
42
+ */
43
+ public function insert (&$ node , $ value )
44
+ {
45
+ if (empty ($ value ) && $ value !== 0 ) {
46
+ return ;
47
+ }
48
+
49
+ if ($ node == null ) {
50
+ $ node = $ this ->createNode ($ value );
51
+ } else if ($ value < $ node ->value ) {
52
+ $ this ->insert ($ node ->left , $ value );
53
+ } else {
54
+ $ this ->insert ($ node ->right , $ value );
55
+ }
56
+ }
57
+
58
+ /**
59
+ * 先序遍历
60
+ * @param $node 根节点
61
+ */
62
+ public function preOrder (&$ node )
63
+ {
64
+ if ($ node != null ) {
65
+ echo $ node ->value . PHP_EOL ;
66
+ $ this ->preOrder ($ node ->left );
67
+ $ this ->preOrder ($ node ->right );
68
+ }
69
+
70
+ }
71
+ /**
72
+ * 中序遍历
73
+ * @param $node 根节点
74
+ */
75
+ public function middleOrder (&$ node )
76
+ {
77
+ if ($ node != null ) {
78
+ $ this ->middleOrder ($ node ->left );
79
+ echo $ node ->value . PHP_EOL ;
80
+ $ this ->middleOrder ($ node ->right );
81
+ }
82
+
83
+ }
84
+
85
+ /**
86
+ * 后序遍历
87
+ * @param $node 根节点
88
+ */
89
+ public function afterOrder (&$ node )
90
+ {
91
+ if ($ node != null ) {
92
+ $ this ->afterOrder ($ node ->left );
93
+ $ this ->afterOrder ($ node ->right );
94
+ echo $ node ->value . PHP_EOL ;
95
+ }
96
+ }
97
+
98
+ /**
99
+ * 获取最大值
100
+ * @param $node 根节点
101
+ */
102
+ public function findMax (&$ node )
103
+ {
104
+ while ($ node ->right != null ) {
105
+ $ node = $ node ->right ;
106
+ }
107
+ return $ node ->value ;
108
+ }
109
+
110
+ }
111
+
112
+ $ tree = new BinarySearchTree ();
113
+ $ tree ->insert ($ tree ->root , 3 );
114
+ $ tree ->insert ($ tree ->root , 9 );
115
+ $ tree ->insert ($ tree ->root , 2 );
116
+ $ tree ->insert ($ tree ->root , 20 );
117
+
118
+ echo "先序遍历 " .PHP_EOL ;
119
+ $ tree ->preOrder ($ tree ->root ); //324
120
+ echo "中序遍历 " . PHP_EOL ;
121
+
122
+ $ tree ->middleOrder ($ tree ->root ); //324
123
+ echo "后序遍历 " . PHP_EOL ;
124
+
125
+ $ tree ->afterOrder ($ tree ->root ); //234
126
+
127
+ $ max = $ tree ->findMax ($ tree ->root );
128
+
129
+ var_dump ($ max );
0 commit comments