<?php
class BiTreeNode
{
public $data;
public $lchild = null; #左孩子
public $rchild = null; #右孩子
public $parent = null; #父节点
public function __construct($data)
{
$this->data = $data;
}
}
# 二叉搜索树:插入
class BST
{
public $root = null;
public function __construct($list = [])
{
if (!empty($list)) {
foreach ($list as $val) {
$this->insert_no_rec($val);
}
}
}
public function insert($node, $val)
{
if (!$node) {
$node = new BiTreeNode($val);
} else if ($val < $node->data) {
$node->lchild = $this->insert($node->lchild, $val);
$node->lchild->parent = $node;
} else if ($val > $node->data) {
$node->rchild = $this->insert($node->rchild, $val);
$node->rchild->parent = $node;
}
return $node;
}
# 非递归插入
public function insert_no_rec($val)
{
$p = $this->root;
if (!$p) {
$this->root = new BiTreeNode($val);
return;
}
while (true) {
if ($val < $p->data) {
if ($p->lchild) {
$p = $p->lchild;
} else {
$p->lchild = new BiTreeNode($val);
$p->lchild->parent = $p;
return;
}
} else if ($val > $p->data) {
if ($p->rchild) {
$p = $p->rchild;
} else {
$p->rchild = new BiTreeNode($val);
$p->rchild->parent = $p;
return;
}
} else {
return;
}
}
}
}
#前序遍历
function pre_order($root)
{
if ($root) {
/* @var $root BiTreeNode */
echo $root->data . ",";
pre_order($root->lchild);
pre_order($root->rchild);
}
}
# 中序遍历
function in_order($root)
{
if ($root) {
/* @var $root BiTreeNode */
in_order($root->lchild);
echo $root->data . ",";
in_order($root->rchild);
}
}
# 后序遍历
function post_order($root)
{
if ($root) {
/* @var $root BiTreeNode */
post_order($root->lchild);
post_order($root->rchild);
echo $root->data . ",";
}
}
# 层次遍历
function level_order($root)
{
$queue = [];
if ($root) {
array_push($queue, $root);
while (count($queue) > 0) {
$node = array_shift($queue);
/* @var $node BiTreeNode */
echo $node->data . ",";
if ($node->lchild) {
array_push($queue, $node->lchild);
}
if ($node->rchild) {
array_push($queue, $node->rchild);
}
}
}
}
$tree = new BST([4, 6, 7, 9, 2, 1, 3, 5, 8]);
$list = range(1, 9);
shuffle($list);
$tree = new BST($list);
pre_order($tree->root);
echo "\n";
in_order($tree->root);
echo "\n";
post_order($tree->root);
echo "\n";
level_order($tree->root);
echo "\n";
二叉搜索树:插入
最新推荐文章于 2024-07-24 23:21:08 发布