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 相关文章推荐
example1.php
Oct 09 PHP
PHP 和 MySQL 基础教程(二)
Oct 09 PHP
php5.2时间相差8小时
Jan 15 PHP
php中强制下载文件的代码(解决了IE下中文文件名乱码问题)
May 09 PHP
解析PHP中VC6 X86和VC9 X86的区别及 Non Thread Safe的意思
Jun 28 PHP
php字符串按照单词进行反转的方法
Mar 14 PHP
PHP is_array() 检测变量是否是数组的实现方法
Jun 13 PHP
/etc/php-fpm.d/www.conf 配置注意事项
Feb 04 PHP
CodeIgniter框架常见用法工作总结
Mar 16 PHP
老生常谈PHP面向对象之注册表模式
May 26 PHP
PHP单例模式模拟Java Bean实现方法示例
Dec 07 PHP
php解决约瑟夫环算法实例分析
Sep 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
免费手机号码归属地API查询接口和PHP使用实例分享
2014/04/10 PHP
CI框架中zip类应用示例
2014/06/17 PHP
PHP 前加at符合@的作用解析
2015/07/31 PHP
PHP常用header头定义代码示例汇总
2020/08/29 PHP
js老生常谈之this,constructor ,prototype全面解析
2016/04/05 Javascript
ASP.NET jquery ajax传递参数的实例
2016/11/02 Javascript
使用smartupload组件实现jsp+jdbc上传下载文件实例解析
2017/01/05 Javascript
React学习笔记之条件渲染(一)
2017/07/02 Javascript
VueJS组件之间通过props交互及验证的方式
2017/09/04 Javascript
使用JavaScript实现在页面中显示距离2017年中秋节的天数
2017/09/26 Javascript
浅谈react-native热更新react-native-pushy集成遇到的问题
2017/09/30 Javascript
实例学习JavaScript读取和写入cookie
2018/01/29 Javascript
详解Angular6.0使用路由步骤(共7步)
2018/06/29 Javascript
Vuex 使用及简单实例(计数器)
2018/08/29 Javascript
vue elementUI 表单校验的实现代码(多层嵌套)
2019/11/06 Javascript
js实现select下拉框选择
2020/01/11 Javascript
一则python3的简单爬虫代码
2014/05/26 Python
Python实现远程调用MetaSploit的方法
2014/08/22 Python
5款非常棒的Python工具
2018/01/05 Python
详解python字节码
2018/02/07 Python
django_orm查询性能优化方法
2018/08/20 Python
python使用Paramiko模块实现远程文件拷贝
2019/04/30 Python
Python中Flask-RESTful编写API接口(小白入门)
2019/12/11 Python
pyinstaller 3.6版本通过pip安装失败的解决办法(推荐)
2020/01/18 Python
Python3.6安装卸载、执行命令、执行py文件的方法详解
2020/02/20 Python
解决python DataFrame 打印结果不换行问题
2020/04/09 Python
python 实现aes256加密
2020/11/27 Python
美国在线鲜花速递:ProFlowers
2017/01/05 全球购物
美国生日蛋糕店:Bake Me A Wish!
2017/02/08 全球购物
罗马尼亚在线杂货店:Pilulka.ro
2019/09/28 全球购物
财务科科长岗位职责
2014/03/10 职场文书
连带责任保证书
2014/04/29 职场文书
企业贷款委托书格式
2014/09/12 职场文书
2015年街道除四害工作总结
2015/05/15 职场文书
运动会口号霸气押韵
2015/12/24 职场文书
zabbix监控mysql的实例方法
2021/06/02 MySQL