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 相关文章推荐
mysql_fetch_row,mysql_fetch_array,mysql_fetch_assoc的区别
Apr 24 PHP
PHP+XML 制作简单的留言本 图文教程
Nov 02 PHP
PHP+ajaxfileupload+jcrop插件完美实现头像上传剪裁
Jun 09 PHP
PHP定时更新程序设计思路分享
Jun 10 PHP
教你如何开启shopnc b2b2c 伪静态
Oct 21 PHP
php写入数据到CSV文件的方法
Mar 14 PHP
PHP命名空间和自动加载类
Apr 03 PHP
微信公众号开发客服接口实例代码
Oct 21 PHP
php 读写json文件及修改json的方法
Mar 07 PHP
thinkphp5使用无限极分类
Feb 18 PHP
PHP7原生MySQL数据库操作实现代码
Jul 03 PHP
如何通过Apache在本地配置多个虚拟主机
Jul 29 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实现检测客户端是否使用代理服务器及其匿名级别
2015/01/07 PHP
phpcms手机内容页面添加上一篇和下一篇
2015/06/05 PHP
初识PHP中的Swoole
2016/04/05 PHP
PHP字符串和十六进制如何实现互相转换
2020/07/16 PHP
ajax更新数据后,jquery、jq失效问题
2011/03/16 Javascript
jquery中dom操作和事件的实例学习-表单验证
2011/11/30 Javascript
javascript 对象数组根据对象object key的值排序
2015/03/09 Javascript
jquery实现滑动特效代码
2015/08/10 Javascript
实例解析JS布尔对象的toString()方法和valueOf()方法
2015/10/25 Javascript
jQuery同步提交示例代码
2015/12/12 Javascript
用Angular实时获取本地Localstorage数据,实现一个模拟后台数据登入的效果
2016/11/09 Javascript
angular+ionic 的app上拉加载更新数据实现方法
2017/01/16 Javascript
jQuery.Form上传文件操作
2017/02/05 Javascript
vue实现留言板todolist功能
2017/08/16 Javascript
微信小程序实现倒计时60s获取验证码
2020/04/17 Javascript
使用canvas进行图像编辑的实例
2017/08/29 Javascript
javascript基于定时器实现进度条功能实例
2017/10/13 Javascript
详解ECMAScript2019/ES10新属性
2019/12/06 Javascript
node koa2 ssr项目搭建的方法步骤
2020/12/11 Javascript
Python简单实现控制电脑的方法
2018/01/22 Python
Python输出由1,2,3,4组成的互不相同且无重复的三位数
2018/02/01 Python
Python 日志logging模块用法简单示例
2019/10/18 Python
pygame实现俄罗斯方块游戏(AI篇2)
2019/10/29 Python
wxPython实现列表增删改查功能
2019/11/19 Python
pyinstaller打包找不到文件的问题解决
2020/04/15 Python
获取python运行输出的数据并解析存为dataFrame实例
2020/07/07 Python
在Pycharm中安装Pandas库方法(简单易懂)
2021/02/20 Python
HTML5中的websocket实现直播功能
2018/05/21 HTML / CSS
英国领先的名牌服装折扣零售商:Brown Bag Clothing
2019/01/08 全球购物
Wiggle澳大利亚:自行车、跑步、游泳商店
2020/11/07 全球购物
建筑学推荐信
2013/11/03 职场文书
趣味运动会策划方案
2014/06/02 职场文书
期末个人总结范文
2015/02/13 职场文书
培训师岗位职责
2015/02/14 职场文书
2015年度内部审计工作总结
2015/05/20 职场文书
分享python函数常见关键字
2022/04/26 Python