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 相关文章推荐
PHP的MVC模式实现原理分析(一相简单的MVC框架范例)
Apr 29 PHP
QQ互联一键登录审核不通过的解决方案
Sep 10 PHP
PHP中使用break跳出多重循环代码实例
Jan 21 PHP
Laravel 5框架学习之向视图传送数据
Apr 08 PHP
Zend Framework基本页面布局分析
Mar 19 PHP
yii2.0实现pathinfo的形式访问的配置方法
Apr 06 PHP
PHP中spl_autoload_register()函数用法实例详解
Jul 18 PHP
Laravel Memcached缓存驱动的配置与应用方法分析
Oct 08 PHP
php魔法函数与魔法常量使用介绍
Jul 23 PHP
PHP的cookie与session原理及用法详解
Sep 27 PHP
phpinfo的知识点总结
Oct 10 PHP
PHP重载基础知识回顾
Sep 10 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
人工智能开始玩《星际争霸2》 你的操作跟得上吗?
2017/08/11 星际争霸
php实现中文转数字
2016/02/18 PHP
关于php几种字符串连接的效率比较(详解)
2017/02/22 PHP
JavaScript 封装Ajax传递的数据代码
2009/06/05 Javascript
js自定义方法通过隐藏iframe实现文件下载
2013/02/21 Javascript
利用jQuery实现可输入搜索文字的下拉框
2013/10/23 Javascript
jQuery如何取id有.的值一般的方法是取不到的
2014/04/18 Javascript
[将免费进行到底]在Amazon的一年免费服务器上安装Node.JS, NPM和OurJS博客
2014/08/18 Javascript
JQuery中DOM事件冒泡实例分析
2015/06/13 Javascript
jQuery插件echarts实现的去掉X轴、Y轴和网格线效果示例【附demo源码下载】
2017/03/04 Javascript
JS实现可视化音频效果的实例代码
2020/01/16 Javascript
Vant 在vue-cli 4.x中按需加载操作
2020/11/05 Javascript
python控制台英汉汉英电子词典
2020/04/23 Python
浅谈python中的getattr函数 hasattr函数
2016/06/14 Python
Python内置模块logging用法实例分析
2018/02/12 Python
PyQt5 pyqt多线程操作入门
2018/05/05 Python
将tensorflow的ckpt模型存储为npy的实例
2018/07/09 Python
Tensorflow使用支持向量机拟合线性回归
2018/09/07 Python
python编程使用协程并发的优缺点
2018/09/20 Python
Python文件监听工具pyinotify与watchdog实例
2018/10/15 Python
用Python实现读写锁的示例代码
2018/11/05 Python
Python3利用Dlib实现摄像头实时人脸检测和平铺显示示例
2019/02/21 Python
在pytorch中查看可训练参数的例子
2019/08/18 Python
Python-opencv实现红绿两色识别操作
2020/06/04 Python
python属于跨平台语言码
2020/06/09 Python
学生爱国演讲稿
2014/01/14 职场文书
人事专员职责
2014/02/22 职场文书
投标承诺书范本
2014/03/27 职场文书
幼儿园新年寄语
2014/04/03 职场文书
论文评语大全
2014/04/29 职场文书
优秀管理者事迹材料
2014/05/22 职场文书
个人三严三实对照检查材料思想汇报
2014/09/22 职场文书
大班下学期幼儿评语
2014/12/30 职场文书
节水倡议书
2015/01/19 职场文书
2015年妇产科工作总结
2015/05/18 职场文书
Go结合Gin导出Mysql数据到Excel表格
2022/08/05 Golang