php删除树结构文件,PHP写数据结构,二叉树删除节点的时候的一点问题

本文展示了如何使用PHP实现一个二叉搜索树(BST),包括插入节点、中序遍历、前序遍历、后序遍历、查找最小值、查找最大值以及查找和删除节点等功能。在删除节点时,特别处理了具有左右子树的情况,通过找到右子树的最小值来替换待删除节点,并删除右子树的最小值节点。在实际运行示例中,创建了一个BST并进行了节点插入、遍历和删除操作。
摘要由CSDN通过智能技术生成

先贴一下代码吧<?php

require_once __DIR__ . '/../../vendor/autoload.php';

class Node

{

/**

* 左叶子节点

*

* @var

*/

public $left;

/**

* 右叶子节点

*

* @var

*/

public $right;

/**

* 节点数据

*

* @var

*/

public $value;

/**

* 生成叶子节点

*

* Node constructor.

* @param $value

* @param $left

* @param $right

*/

public function __construct($value, $left, $right)

{

$this->left = $left;

$this->right = $right;

$this->value = $value;

}

}

class BinaryTree

{

/**

* 根节点

*

* @var

*/

public $root;

public function insertNode($data)

{

$node = $this->createNode($data);

if (is_null($this->root)) {

$this->root = $node;

} else {

$this->insert($this->root, $node);

}

}

/**

* 插入左节点

*

* @param $data

*/

public function insert(Node $node, Node $newNode)

{

if ($newNode->value < $node->value) {

if ($node->left == null) {

$node->left = $newNode;

} else {

$this->insert($node->left, $newNode);

}

}

if ($newNode->value > $node->value) {

if ($node->right == null) {

$node->right = $newNode;

} else {

$this->insert($node->right, $newNode);

}

}

}

/**

* 用于输出顺序排序

*

* @param $node

*/

public function inOrderTraverse($node)

{

if ($node != null) {

$this->inOrderTraverse($node->left);

dump($node->value);

$this->inOrderTraverse($node->right);

}

}

/**

* 前序遍历,用于复制二叉树

*

* @param $node

*/

public function preOrderTraverse($node)

{

if ($node != null) {

dump($node->value);

$this->preOrderTraverse($node->left);

$this->preOrderTraverse($node->right);

}

}

/**

* 后序遍历 文件夹系统遍历

*

* @param $node

*/

public function postOrderTraverse($node)

{

if ($node != null) {

$this->postOrderTraverse($node->left);

$this->postOrderTraverse($node->right);

dump($node->value);

}

}

/**

* 添加节点

*

* @param $data

* @param null $left

* @param null $right

* @return Node

*/

public function createNode($data, $left = null, $right = null)

{

return new Node($data, $left, $right);

}

/**

* 查找二叉树最小节点

*

* @param $node

* @return mixed

*/

public function findMin($node)

{

while ($node && $node->left != null) {

$node = $node->left;

}

return $node->value;

}

/**

* 寻找最大数值

*

* @param $node

* @return mixed

*/

public function findMax($node)

{

while ($node && $node->right != null) {

$node = $node->right;

}

return $node->value;

}

/**

* 二叉树节点查找

*

* @param $node

* @param $value

* @return bool

*/

public function find($node, $value)

{

if ($node == null) {

return false;

}

if ($value > $node->value) {

return $this->find($node->right, $value);

} elseif ($value < $node->value) {

return $this->find($node->left, $value);

} else {

return true;

}

}

/**

* 二叉树删除节点

*

* @param $node

* @param $value

* @return null

*/

public function removeNode($node, $value)

{

if ($node == null) {

return null;

}

if ($value > $node->value) {

$node->right = $this->removeNode($node->right, $value);

return $node;

} elseif ($value < $node->value) {

$node->left = $this->removeNode($node->left, $value);

return $node;

} else {

// 第一种情况,删除节点是叶子结点,没有左子树也没有右子树,直接删除掉即可

if ($node->left == null && $node->right == null) {

return null;

}

// 第二种情况,存在一个左节点或者右节点

if ($node->left == null) {

$node = $node->left;

return $node;

} elseif ($node->right == null) {

$node = $node->right;

return $node;

} else {

// 第三种情况, 左右节点都有孩子,那么要找到右节点的最小值,

//把他替换成当前要删除节点的值,然后把原节点删除掉

$minValue = $this->findMin($node->right);

$node->value = $minValue;

$node->right = $this->removeNode($node->right, $minValue);

return $node;

}

}

}

}

/**

*

* 8

* / \

* 3 10

* / \ \

* 1 6 14

* / \ / \

* 4 7 13 20

*

*

*/

$tree = new BinaryTree;

$tree->insertNode(8);

$tree->insertNode(3);

$tree->insertNode(10);

$tree->insertNode(1);

$tree->insertNode(6);

$tree->insertNode(14);

$tree->insertNode(4);

$tree->insertNode(7);

$tree->insertNode(13);

$tree->insertNode(20);

//dd($tree->root);

// 中序遍历测试

//$tree->inOrderTraverse($tree->root);

// 前序遍历测试

//$tree->preOrderTraverse($tree->root);

// 后序遍历测试

//$tree->postOrderTraverse($tree->root);

// 查找最小值测试

//$min = $tree->findMin($tree->root);

//dd($min);

// 查找最大值测试

//$max = $tree->findMax($tree->root);

//dd($max);

// 查找节点

//$nodeExists = $tree->find($tree->root, 9);

//dd($nodeExists);

// 删除节点测试

//dump($tree->root);

//$result = $tree->removeNode($tree->root, 1);

//dd($result);

//dump($tree->root);

$result = $tree->removeNode($tree->root, 8);

dump($result);

我在用PHP实现二叉树结构的时候,写二叉树节点删除,删除的节点假如有左右子树,需要把先找到右子树的最小节点,待删除节点的值 = 右子树最小值,然后删除右子树的这个最小值, 但是如果跨节点的话,比如,我要删除8节点的时候,10会替换到8的位置,但是10后面的节点也会被清空,这种情况我的代码需要怎么补充一下啊,想了半天没写出来

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值