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 相关文章推荐
桌面中心(一)创建数据库
Oct 09 PHP
杏林同学录(三)
Oct 09 PHP
php 文件上传系统手记
Oct 26 PHP
Ajax PHP 边学边练 之三 数据库
Nov 26 PHP
php方法调用模式与函数调用模式简例
Sep 20 PHP
PHP中usort在值相同时改变原始位置问题的解决方法
Nov 27 PHP
CI框架中集成CKEditor编辑器的教程
Jun 09 PHP
PHP的Laravel框架中使用AdminLTE模板来编写网站后台界面
Mar 21 PHP
Yii2如何批量添加数据
May 17 PHP
php cookie 详解使用实例
Nov 03 PHP
PHP实现的微信公众号扫码模拟登录功能示例
May 30 PHP
PHP实现一个限制实例化次数的类示例
Sep 16 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过滤危险html代码的函数
2008/07/22 PHP
PHP Header用于页面跳转要注意的几个问题总结
2008/10/03 PHP
php gzip压缩输出的实现方法
2013/04/27 PHP
PHP处理Ajax请求与Ajax跨域问题
2017/02/13 PHP
基于PHP+Mysql简单实现了图书购物车系统的实例详解
2020/08/06 PHP
原始的js代码和jquery对比体会
2013/09/10 Javascript
解析JavaScript中点号“.”的多义性
2013/12/02 Javascript
jquery弹出层类代码分享
2013/12/27 Javascript
jquery删除指定的html标签并保留标签内文本内容的方法
2014/04/02 Javascript
javascript引用类型指针的工作方式
2015/04/13 Javascript
js实现两点之间画线的方法
2015/05/12 Javascript
详解Node.js模块间共享数据库连接的方法
2016/05/24 Javascript
Actionscript与javascript交互实例程序(修改)
2016/09/22 Javascript
nodejs和C语言插入mysql数据库乱码问题的解决方法
2017/04/14 NodeJs
JS实现瀑布流布局
2017/10/21 Javascript
关于vue-router的那些事儿
2018/05/23 Javascript
微信小程序iBeacon测距及稳定程序的实现解析
2019/07/31 Javascript
[01:17]Ti4 循环赛第一日回顾
2014/07/11 DOTA
python的tkinter布局之简单的聊天窗口实现方法
2014/09/03 Python
Python字典及字典基本操作方法详解
2018/01/30 Python
Python实现聊天机器人的示例代码
2018/07/09 Python
pycham查看程序执行的时间方法
2018/11/29 Python
浅谈tensorflow模型保存为pb的各种姿势
2020/05/25 Python
Python新手学习装饰器
2020/06/04 Python
通过实例简单了解python yield使用方法
2020/08/06 Python
详解pycharm2020.1.1专业版安装指南(推荐)
2020/08/07 Python
python如何编写类似nmap的扫描工具
2020/11/06 Python
python操作toml文件的示例代码
2020/11/27 Python
HTML5的结构和语义(4):语义性的内联元素
2008/10/17 HTML / CSS
CHARLES & KEITH台湾官网:新加坡时尚品牌
2019/07/30 全球购物
中专生自荐信
2013/10/12 职场文书
学生思想表现的评语
2014/01/30 职场文书
乡镇信息公开实施方案
2014/03/23 职场文书
我爱我校演讲稿
2014/05/21 职场文书
2014年纪检工作总结
2014/11/12 职场文书
导游词之河北滦平金山岭长城
2019/10/16 职场文书