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脚本数据库功能详解(中)
Oct 09 PHP
PHP新手上路(七)
Oct 09 PHP
php运行出现Call to undefined function curl_init()的解决方法
Nov 02 PHP
Zend的Registry机制的使用说明
May 02 PHP
PHP中array_merge和array相加的区别分析
Jun 17 PHP
php上传文件问题汇总
Jan 30 PHP
PHP进行批量任务处理不超时的解决方法
Jul 11 PHP
thinkPHP5.0框架开发规范简介
Mar 25 PHP
Thinkphp5 微信公众号token验证不成功的原因及解决方法
Nov 12 PHP
阿里云Win2016安装Apache和PHP环境图文教程
Mar 11 PHP
php TP5框架生成二维码链接
Apr 01 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
初学CAKEPHP 基础教程
2009/11/02 PHP
php checkdate、getdate等日期时间函数操作详解
2010/03/11 PHP
php 去除html标记--strip_tags与htmlspecialchars的区别详解
2013/06/26 PHP
php实现根据url自动生成缩略图的方法
2014/09/23 PHP
ThinkPHP V2.2说明文档没有说明的那些事实例小结
2015/07/01 PHP
phpinfo() 中 Local Value(局部变量)Master Value(主变量) 的区别
2016/02/03 PHP
PHP 接入支付宝即时到账功能
2016/09/18 PHP
JavaScript高级程序设计(第3版)学习笔记3 js简单数据类型
2012/10/11 Javascript
jQuery性能优化28条建议你值得借鉴
2013/02/16 Javascript
js导出table到excel同时兼容FF和IE示例
2013/09/03 Javascript
jquery动态分页效果堪比时光网
2014/09/25 Javascript
浅谈jQuery中replace()方法
2015/05/13 Javascript
浅谈js数据类型判断与数组判断
2016/08/29 Javascript
BootStrap实现手机端轮播图左右滑动事件
2016/10/13 Javascript
canvas学习之API整理笔记(一)
2016/12/29 Javascript
Angular2库初探
2017/03/01 Javascript
在小程序开发中使用npm的方法
2018/10/17 Javascript
JavaScript基础之静态方法和实例方法分析
2018/12/26 Javascript
[01:14]2014DOTA2展望TI 剑指西雅图newbee战队专访
2014/06/30 DOTA
给Python中的MySQLdb模块添加超时功能的教程
2015/05/05 Python
从头学Python之编写可执行的.py文件
2017/11/28 Python
python并发编程多进程之守护进程原理解析
2019/08/20 Python
python3 实现函数写文件路径的正确方法
2019/11/27 Python
Python 从attribute到property详解
2020/03/05 Python
pycharm中导入模块错误时提示Try to run this command from the system terminal
2020/03/26 Python
python 使用while循环输出*组成的菱形实例
2020/04/12 Python
新建文件时Pycharm中自动设置头部模板信息的方法
2020/04/17 Python
Python创建临时文件和文件夹
2020/08/05 Python
大学校务公开实施方案
2014/03/31 职场文书
学生请假条格式
2014/04/11 职场文书
小学生保护环境倡议书
2014/05/15 职场文书
服务宗旨标语
2014/07/01 职场文书
见习报告格式要求
2014/11/04 职场文书
2014年党务工作总结
2014/11/25 职场文书
Python编程中Python与GIL互斥锁关系作用分析
2021/09/15 Python
Android开发之底部导航栏的快速实现
2022/04/28 Java/Android