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 相关文章推荐
收集的DedeCMS一些使用经验
Mar 17 PHP
PHP 在5.1.* 和5.2.*之间 PDO数据库操作中的不同之处小结
Mar 07 PHP
yii框架表单模型使用及以数组形式提交表单数据示例
Apr 30 PHP
destoon公司主页模板风格的添加方法
Jun 20 PHP
PHP中使用json数据格式定义字面量对象的方法
Aug 20 PHP
PHP+jQuery 注册模块的改进(三):更新到Smarty3.1
Oct 14 PHP
php+ajax实时刷新简单实例
Feb 25 PHP
详细解读PHP中接口的应用
Aug 12 PHP
Yii实现复选框批量操作实例代码
Mar 15 PHP
PHP+Apache环境中如何隐藏Apache版本
Nov 24 PHP
PHP反射实际应用示例
Apr 03 PHP
phpquery中文手册
Mar 18 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 信息采集程序代码
2009/03/17 PHP
深入理解PHP中的global
2014/08/19 PHP
Linux系统递归生成目录中文件的md5的方法
2015/06/29 PHP
功能强大的php分页函数
2016/07/20 PHP
javascript学习笔记(五) Array 数组类型介绍
2012/06/19 Javascript
jquery Tab效果和动态加载的简单实例
2013/12/11 Javascript
jQuery中clearQueue()方法用法实例
2014/12/29 Javascript
JS控制网页动态生成任意行列数表格的方法
2015/03/09 Javascript
jQuery对象与DOM对象转换方法详解
2016/05/10 Javascript
JavaScript中英文字符长度统计方法示例【按照中文占2个字符】
2017/01/17 Javascript
JavaScript事件处理程序详解
2017/09/19 Javascript
AngularJS实现图片上传和预览功能的方法分析
2017/11/08 Javascript
利用layer实现表单完美验证的方法
2019/09/26 Javascript
node.js制作一个简单的登录拦截器
2020/02/10 Javascript
vue+Element-ui前端实现分页效果
2020/11/15 Javascript
[55:02]2014 DOTA2国际邀请赛中国区预选赛 HGT VS Orenda
2014/05/21 DOTA
python实现比较两段文本不同之处的方法
2015/05/30 Python
Python3使用requests包抓取并保存网页源码的方法
2016/03/15 Python
python 删除大文件中的某一行(最有效率的方法)
2017/08/19 Python
Python简单读取json文件功能示例
2017/11/30 Python
攻击者是如何将PHP Phar包伪装成图像以绕过文件类型检测的(推荐)
2018/10/11 Python
python3.7 利用函数os pandas利用excel对文件名进行归类
2019/09/29 Python
python PyAUtoGUI库实现自动化控制鼠标键盘
2020/09/09 Python
Python 必须了解的5种高级特征
2020/09/10 Python
John Varvatos官方网站:设计师男士时装
2017/02/08 全球购物
德国家具购物网站:Möbel Höffner
2019/08/26 全球购物
印尼第一大家居、生活和家具电子商务:Ruparupa
2019/11/25 全球购物
Noon埃及:埃及在线购物
2019/11/26 全球购物
土木工程应届生求职信
2013/10/31 职场文书
物业管理专业个人的自我评价
2013/11/19 职场文书
大学考试作弊检讨书
2014/01/30 职场文书
2014学生会工作总结报告
2014/12/02 职场文书
基于Redis实现分布式锁的方法(lua脚本版)
2021/05/12 Redis
详解使用 CSS prefers-* 规范提升网站的可访问性与健壮性
2021/05/25 HTML / CSS
新手入门Mysql--概念
2021/06/18 MySQL
【DOTA2】高能暴走TK秀!PSG LGD vs ASTER - DPC 2022 WINTER TOUR CN
2022/04/02 DOTA