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
php递归列出所有文件和目录的代码
Sep 10 PHP
php email邮箱正则
Oct 08 PHP
php 动态多文件上传
Jan 18 PHP
php中通过curl smtp发送邮件
Jun 05 PHP
解析PHP将对象转换成数组的方法(兼容多维数组类型)
Jun 21 PHP
在wamp集成环境下升级php版本(实现方法)
Jul 01 PHP
PHP使用SOAP调用.net的WebService数据
Nov 12 PHP
一个不易被发现的PHP后门代码解析
Jul 05 PHP
PHP上传Excel文件导入数据到MySQL数据库示例
Oct 25 PHP
php删除二维数组中的重复值方法
Mar 12 PHP
Yii框架多语言站点配置方法分析【中文/英文切换站点】
Apr 07 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
阿拉伯的咖啡与水烟
2021/03/03 咖啡文化
PHP脚本数据库功能详解(中)
2006/10/09 PHP
php若干单维数组遍历方法的比较
2011/09/20 PHP
ThinkPHP添加更新标签的方法
2014/12/05 PHP
总结PHP如何获取当前主机、域名、网址、路径、端口和参数等
2016/09/09 PHP
浅谈php(codeigniter)安全性注意事项
2017/04/06 PHP
js DOM 元素ID就是全局变量
2012/09/20 Javascript
JS localStorage实现本地缓存的方法
2013/06/22 Javascript
JavaScript中数据结构与算法(一):栈
2015/06/19 Javascript
js实现仿qq消息的弹出窗效果
2016/01/06 Javascript
深入浅析JavaScript中的作用域和上下文
2016/03/26 Javascript
vue实现图片滚动的示例代码(类似走马灯效果)
2018/03/03 Javascript
vue实现的网易云音乐在线播放和下载功能案例
2019/02/18 Javascript
Node 搭建一个静态资源服务器的实现
2019/05/20 Javascript
通过实例了解js函数中参数的传递
2019/06/15 Javascript
Vue项目中使用flow做类型检测的方法
2020/03/18 Javascript
Python实现八大排序算法
2016/08/13 Python
详解numpy.meshgrid()方法使用
2019/08/01 Python
pytorch中torch.max和Tensor.view函数用法详解
2020/01/03 Python
Python如何爬取qq音乐歌词到本地
2020/06/01 Python
基于python实现简单网页服务器代码实例
2020/09/14 Python
python编写扎金花小程序的实例代码
2021/02/23 Python
css3类选择器之结合元素选择器和多类选择器用法
2017/03/09 HTML / CSS
微信小程序之html5 canvas绘图并保存到系统相册
2019/06/20 HTML / CSS
我们是伦敦女孩:WalG
2018/01/08 全球购物
英国在线玫瑰专家:InterRose
2019/12/01 全球购物
澳大利亚领先的时尚内衣零售商:Bras N Things
2020/07/28 全球购物
秋季运动会通讯稿
2014/01/24 职场文书
试用期旷工辞退通知书
2015/04/17 职场文书
法律意见书范文
2015/05/20 职场文书
《吃水不忘挖井人》教学反思
2016/02/22 职场文书
七年级作文之关于奶奶
2019/10/29 职场文书
JavaScript 语句之常用 for 循环详解
2021/03/29 Javascript
详解Java ES多节点任务的高效分发与收集实现
2021/06/30 Java/Android
Vue3中的Refs和Ref详情
2021/11/11 Vue.js
Win10加载疑难解答时出错发生意外错误的解决方法
2022/07/07 数码科技