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 中的一些经验积累
Oct 09 PHP
php无限遍历文件夹示例分享
Mar 04 PHP
兼容PHP和Java的des加密解密代码分享
Jun 26 PHP
使用ob系列函数实现PHP网站页面静态化
Aug 13 PHP
PHP实现懒加载的方法
Mar 07 PHP
四个常见html网页乱码问题及解决办法
Sep 08 PHP
如何写php守护进程(Daemon)
Dec 30 PHP
Yii2汉字转拼音类的实例代码
Apr 18 PHP
PDO::lastInsertId讲解
Jan 29 PHP
详解PHP的抽象类和抽象方法以及接口总结
Mar 15 PHP
php根据地址获取百度地图经纬度的实例方法
Sep 03 PHP
Thinkphp 框架扩展之应用模式实现方法分析
Apr 27 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
做了CDN获取用户真实IP的函数代码(PHP与Asp设置方式)
2013/04/13 PHP
php随机显示图片的简单示例
2014/02/15 PHP
destoon切换城市后实现logo旁边显示地区名称的方法
2014/08/21 PHP
php生成RSS订阅的方法
2015/02/13 PHP
PHP简单计算两个时间差的方法示例
2017/06/20 PHP
PHP封装的简单连接MongoDB类示例
2019/02/13 PHP
JavaScript的面向对象(一)
2006/11/09 Javascript
javascript 随机展示头像实现代码
2011/12/06 Javascript
js实现网站首页图片滚动显示
2013/02/04 Javascript
JavaScript中“过于”犀利地for/in循环使用示例
2013/10/22 Javascript
JS对象转换为Jquery对象实现代码
2013/12/29 Javascript
jQuery 动态云标签插件
2014/11/11 Javascript
JavaScript让网页出现渐隐渐显背景颜色的方法
2015/04/21 Javascript
轻松学习jQuery插件EasyUI EasyUI创建菜单与按钮
2015/11/30 Javascript
javascript+css3 实现动态按钮菜单特效
2016/02/06 Javascript
js和C# 时间日期格式转换的简单实例
2016/05/28 Javascript
jQuery简单注册和禁用全局事件的方法
2016/07/25 Javascript
js 自带的sort() 方法全面了解
2016/08/16 Javascript
vue.js实现用户评论、登录、注册、及修改信息功能
2020/05/30 Javascript
Angular.js项目中使用gulp实现自动化构建以及压缩打包详解
2017/07/19 Javascript
express框架实现基于Websocket建立的简易聊天室
2017/08/10 Javascript
vue-router+vuex addRoutes实现路由动态加载及菜单动态加载
2017/09/28 Javascript
一次记住JavaScript的6个正则表达式方法
2018/02/22 Javascript
浅谈FastClick 填坑及源码解析
2018/03/02 Javascript
ES6 更易于继承的类语法的使用
2019/02/11 Javascript
node使用mysql获取数据库数据中文乱码问题的解决
2019/12/02 Javascript
原生javascript的ajax请求及后台PHP响应操作示例
2020/02/24 Javascript
[15:39]教你分分钟做大人:龙骑士
2014/10/30 DOTA
Tornado Web服务器多进程启动的2个方法
2014/08/04 Python
python 将md5转为16字节的方法
2018/05/29 Python
浅谈Python里面小数点精度的控制
2018/07/16 Python
django xadmin中form_layout添加字段显示方式
2020/03/30 Python
大学生毕业求职的自我评价
2013/09/29 职场文书
银行委托书范本
2014/04/04 职场文书
2015年工会工作总结
2015/03/30 职场文书
环保守法证明
2015/06/24 职场文书