PHP实现排序二叉树的基本功能

本文实现了 排序二叉树节点的插入,中序遍历,极值的查找和特定值的查找的功能.

基本没有提供什么概念和定义.建议先简单了解一下本文提供的几个概念在来看本文.

实际上,只是简单的提供了代码,注释也很少,各位辛苦了.

二叉树:在计算机科学中,二叉树是每个节点最多有两个子树的树结构。

排序二叉树: 左孩子节点的值小于父节点的值,右孩子节点的值大于父节点的值.

几个概念:

根节点

叶子节点

左子树

右子树

中序遍历

前序遍历

后序遍历

二叉树查找

中序遍历:

先遍历左子树,在遍历本节点,在遍历右节点.遍历之后的结果就是排序好之后的结果

// created by 曲朋维
// 排序二叉树
// 完成以下任务.
// 1. 将节点插入到对应位置
// 2. 使用中序遍历遍历这个二叉树
// 3. 找到这个二叉树的极值
// 4. 搜索一个特定的值

class Node{
    public $key,$left,$right;
    public function __construct($key)
    {
        $this->key = $key;
    }
}

class BinaryTree{
    public $root;
    public $sortArr = [];
    // 插入节点
    public function insertNode($node,$newNode){
        if ($node->key < $newNode->key){
            // 如果父节点小于子节点,插到右边
            if (empty($node->right)){
                $node->right = $newNode;
            }else{
                $this->insertNode($node->right,$newNode);
            }
        }elseif ($node->key > $newNode->key){
            // 如果父节点大于子节点,插到左边
            if (empty($node->left)){
                $node->left = $newNode;
            }else{
                $this->insertNode($node->left,$newNode);
            }
        }
    }
    public function insert($key){
        $newNode = new Node($key);
        if (empty($this->root)){
            $this->root = $newNode;
        }else{
            $this->insertNode($this->root,$newNode);
        }
    }
    // 中序遍历
    public function midSort(){
        $this->midSortNode($this->root);
    }
    public function midSortNode($node){
        if (!empty($node)){
            $this->midSortNode($node->left);
            array_push($this->sortArr,$node->key);
            $this->midSortNode($node->right);
        }
    }
    // 寻找极值
    public function findMin(){
        //不断的找它的左子树,直到这个左子树的节点为叶子节点.
        if (!empty($this->root)){
            $this->findMinNode($this->root);
        }
    }
    public function findMinNode(Node $node){
        if (!empty($node->left)){
            $this->findMinNode($node->left);
        }else{
            echo '这个二叉树的最小值为:'.$node->key;
        }
    }
    public function findMax(){
        if (!empty($this->root)){
            $this->findMaxNode($this->root);
        }
    }
    public function findMaxNode(Node $node){
        if (!empty($node->right)){
            $this->findMaxNode($node->right);
        }else{
            echo '这个二叉树的最大值为:'.$node->key;
        }
    }
    // 查找特定的值
    public function find($val = ''){
        if (!empty($val)){
            $this->findNode($this->root,$val);
        }
    }
    public function findNode(Node $node,$val){
        if ($node->key == $val){
            echo '找到'.$val.'了';
        }else if ($node->key > $val){
            // 如果 父节点的值 大于要查找的值,那么查找它的左子树
            if (!empty($node->left)){
                $this->findNode($node->left,$val);
            }else{
                echo '没有这个东西!';
            }
        }else if ($node->key < $val){
            if (!empty($node->right)){
                $this->findNode($node->right,$val);
            }else{
                echo '没有这个东西!';
            }
        }
    }
}

$tree = new BinaryTree();
// 节点插入
$nodes = array(8,3,10,1,6,14,4,7,13);
foreach ($nodes as $value){
    $tree->insert($value);
}
// 中序遍历
//$tree->midSort();
//print_r($tree->sortArr);
// 寻找极值
//$tree->findMin();
//$tree->findMax();
// 查找特定的值
$tree->find(7);
$tree->find(11);
--------------------- https://blog.csdn.net/oops_qu/article/details/78280906

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值