PHP排序二叉树基本功能实现方法示例


Posted in PHP onMay 26, 2018

本文实例讲述了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);
echo "<br/>";
$tree->find(11);

运行结果:

找到7了
没有这个东西!

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
MySQL相关说明
Jan 15 PHP
php截取字符串之截取utf8或gbk编码的中英文字符串示例
Mar 12 PHP
php 魔术方法详解
Nov 11 PHP
PHP自定session保存路径及删除、注销与写入的方法
Nov 18 PHP
Yii实现多数据库主从读写分离的方法
Dec 29 PHP
thinkphp备份数据库的方法分享
Jan 04 PHP
jquery获取多个checkbox的值异步提交给php的方法
Jun 24 PHP
详解HTTP Cookie状态管理机制
Jan 14 PHP
PHP生成及获取JSON文件的方法
Aug 23 PHP
php中str_pad()函数用法分析
Mar 28 PHP
PHP中error_reporting函数用法详细介绍
Jun 11 PHP
laravel实现按月或天或小时统计mysql数据的方法
Oct 09 PHP
Thinkphp5+uploadify实现的文件上传功能示例
May 26 #PHP
PHP ADODB实现事务处理功能示例
May 25 #PHP
PHP ADODB实现分页功能简单示例
May 25 #PHP
ThinkPHP5.0框架控制器继承基类和自定义类示例
May 25 #PHP
php7函数,声明,返回值等新特性介绍
May 25 #PHP
php框架CodeIgniter主从数据库配置方法分析
May 25 #PHP
CodeIgniter框架数据库基本操作示例
May 24 #PHP
You might like
php使用正则过滤js脚本代码实例
2014/05/10 PHP
关于PHP中字符串与多进制转换函数的实例代码
2016/11/03 PHP
PHP实现的回溯算法示例
2017/08/15 PHP
PHP7如何开启Opcode打造强悍性能详解
2018/05/11 PHP
非阻塞动态加载javascript广告实现代码
2010/11/17 Javascript
JS实现文字掉落效果的方法
2015/05/06 Javascript
正则表达式优化JSON字符串的技巧
2015/12/24 Javascript
jquery广告无缝轮播实例
2017/01/05 Javascript
nodejs 子进程正确的打开方式
2017/07/03 NodeJs
微信小程序“摇一摇”的实例代码
2017/07/20 Javascript
JavaScript实现连连看连线算法
2019/01/05 Javascript
微信小程序如何调用新闻接口实现列表循环
2019/07/02 Javascript
Vue3 中的数据侦测的实现
2019/10/09 Javascript
Vue3.0数据响应式原理详解
2019/10/09 Javascript
Vue实现简单的留言板
2020/10/23 Javascript
[43:32]2014 DOTA2华西杯精英邀请赛 5 25 LGD VS NewBee第一场
2014/05/26 DOTA
[01:51]2014DOTA2国际邀请赛 这个赛场没有失败者VGTi5再见
2014/07/23 DOTA
深入理解python多进程编程
2016/06/12 Python
pip matplotlib报错equired packages can not be built解决
2018/01/06 Python
简单实现python画圆功能
2018/01/25 Python
Python编程中NotImplementedError的使用方法
2018/04/21 Python
python 删除非空文件夹的实例
2018/04/26 Python
基于python实现文件加密功能
2020/01/06 Python
Python文字截图识别OCR工具实例解析
2020/03/05 Python
Django REST Swagger实现指定api参数
2020/07/07 Python
优秀研究生自我鉴定
2013/12/04 职场文书
优秀的茶餐厅创业计划书
2014/01/03 职场文书
学生实习介绍信
2014/01/15 职场文书
教学改革实施方案
2014/03/31 职场文书
建筑结构施工求职信
2014/07/11 职场文书
支部书记四风问题对照检查材料
2014/10/04 职场文书
2014年审计工作总结
2014/11/17 职场文书
2014年高中教师工作总结
2014/12/19 职场文书
初中化学教学反思
2016/02/22 职场文书
新学期小学班主任工作计划
2019/06/21 职场文书
聊聊JS ES6中的解构
2021/04/29 Javascript