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 相关文章推荐
实用函数4
Nov 08 PHP
简单的php 验证图片生成函数
May 21 PHP
PHP 一个比较完善的简单文件上传
Mar 25 PHP
Mysql数据库操作类( 1127版,提供源码下载 )
Dec 02 PHP
php 变量未定义等错误的解决方法
Jan 12 PHP
使用PHP生成二维码的两种方法(带logo图像)
Mar 14 PHP
PHP防范SQL注入的具体方法详解(测试通过)
May 09 PHP
php中Array2xml类实现数组转化成XML实例
Dec 08 PHP
php下pdo的mysql事务处理用法实例
Dec 27 PHP
smarty内置函数{loteral}、{ldelim}和{rdelim}用法实例
Jan 22 PHP
php 升级到 5.3+ 后出现的一些错误,如 ereg(); ereg_replace(); 函数报错
Dec 07 PHP
利用PHPStorm如何开发Laravel应用详解
Aug 30 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关联链接常用代码
2012/11/05 PHP
php防止SQL注入详解及防范
2013/11/12 PHP
美图秀秀web开放平台--PHP流式上传和表单上传示例分享
2014/06/22 PHP
详解WordPress中给链接添加查询字符串的方法
2015/12/18 PHP
PHP使用Memcache时模拟命名空间及缓存失效问题的解决
2016/02/27 PHP
php连接oracle数据库的方法(测试成功)
2016/05/26 PHP
Laravel接收前端ajax传来的数据的实例代码
2017/07/20 PHP
thinkphp3.2同时连接两个数据库的简单方法
2019/08/13 PHP
JavaScript 脚本将当地时间转换成其它时区
2009/03/19 Javascript
最佳JS代码编写的14条技巧
2011/01/09 Javascript
5秒后跳转效果(setInterval/SetTimeOut)
2013/05/03 Javascript
javascript高级编程之函数表达式 递归和闭包函数
2015/11/29 Javascript
Node.js重新刷新session过期时间的方法
2016/02/04 Javascript
最细致的vue.js基础语法 值得收藏!
2016/11/03 Javascript
cocos creator Touch事件应用(触控选择多个子节点的实例)
2017/09/10 Javascript
vue项目如何刷新当前页面的方法
2018/05/18 Javascript
react-native android状态栏的实现
2018/06/15 Javascript
原生javascript实现连连看游戏
2019/01/03 Javascript
vue 授权获取微信openId操作
2020/11/13 Javascript
Python迭代和迭代器详解
2016/11/10 Python
python中的插值 scipy-interp的实现代码
2018/07/23 Python
python进阶之多线程对同一个全局变量的处理方法
2018/11/09 Python
Python实战之制作天气查询软件
2019/05/14 Python
详解用python计算阶乘的几种方法
2019/08/14 Python
Python 实现敏感目录扫描的示例代码
2020/05/21 Python
Python异常处理机制结构实例解析
2020/07/23 Python
美国女士泳装店:Swimsuits For All
2017/03/02 全球购物
Otticanet意大利:最顶尖的世界名牌眼镜, 能得到打折季的价格
2019/03/10 全球购物
Java面试题:请问一下代码输出是什么
2015/05/27 面试题
毕业生的求职信范文分享
2013/12/04 职场文书
数控机械专业个人的自我评价
2014/01/02 职场文书
建议书的格式
2014/05/12 职场文书
服务承诺书怎么写
2014/05/24 职场文书
居委会工作总结2015
2015/05/18 职场文书
深入解读Java三大集合之map list set的用法
2021/11/11 Java/Android
Python帮你解决手机qq微信内存占用太多问题
2022/02/15 Python