Skip to content

Commit 34cb6a0

Browse files
authored
Merge pull request #59 from xianyunyh/master
Add:BinarySearchTree
2 parents 0e1d034 + f4ca788 commit 34cb6a0

File tree

2 files changed

+131
-1
lines changed

2 files changed

+131
-1
lines changed

README.md

+2-1
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,8 @@
5050
│ ├── Structure 数据结构
5151
│ │ ├── StackExample.php 堆栈 先进后出 LIFO (Last In First Out)
5252
│ │ ├── LinearChain.php 线性表 单链存储
53-
│ │ └── LinearOrder.php 线性表 顺序存储
53+
│ │ └── LinearOrder.php 线性表 顺序存储
54+
│ │ └── BinarySearchTree.php 二叉搜索树
5455
│ │
5556
│ ├── Tools 小工具集
5657
│ │ └── SystemSwitch.php 堆栈实现进制转换
+129
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
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

Comments
 (0)