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