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中sprintf与printf函数用法区别解析
Feb 17 PHP
PHP多进程编程实例
Oct 15 PHP
PHP向socket服务器收发数据的方法
Jan 24 PHP
大家在抢红包,程序员在研究红包算法
Aug 31 PHP
php简单日历函数
Oct 28 PHP
php实现mysql数据库连接操作及用户管理
Nov 08 PHP
php简单解析mysqli查询结果的方法(2种方法)
Jun 29 PHP
php图片合成方法(多张图片合成一张)
Nov 25 PHP
Phpstorm+Xdebug断点调试PHP的方法
May 14 PHP
PHP命名空间与自动加载类详解
Sep 04 PHP
PHP PDOStatement::debugDumpParams讲解
Jan 30 PHP
TP5多入口设置实例讲解
Dec 15 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 文件上传功能实现代码
2009/06/24 PHP
php分页函数示例代码分享
2014/02/24 PHP
PHP实现基于文本的摩斯电码生成器
2016/01/11 PHP
深入理解PHP中的empty和isset函数
2016/05/26 PHP
PHP多进程编程之僵尸进程问题的理解
2017/10/15 PHP
javascript 原型模式实现OOP的再研究
2009/04/09 Javascript
Javascript代码在页面加载时的执行顺序介绍
2013/05/03 Javascript
基于jQuery实现放大镜特效
2020/10/19 Javascript
js定义类的几种方法(推荐)
2016/06/08 Javascript
JS 通过系统时间限定动态添加 select option的实例代码
2016/06/09 Javascript
简单实现js点击展开二级菜单功能
2017/05/16 Javascript
nodejs+websocket实时聊天系统改进版
2017/05/18 NodeJs
详解js静态资源文件请求的处理
2017/08/01 Javascript
vue中$refs的用法及作用详解
2018/04/24 Javascript
使用react render props实现倒计时的示例代码
2018/12/06 Javascript
JavaScript原型式继承实现方法
2019/11/06 Javascript
JS实现京东商品分类侧边栏
2020/12/11 Javascript
详解Django项目中模板标签及模板的继承与引用(网站中快速布置广告)
2019/03/27 Python
pyqt5 实现多窗口跳转的方法
2019/06/19 Python
详解Python Opencv和PIL读取图像文件的差别
2019/12/27 Python
Python sublime安装及配置过程详解
2020/06/29 Python
html5 学习简单的拾色器
2010/09/03 HTML / CSS
HTML5 placeholder(空白提示)属性介绍
2013/08/07 HTML / CSS
美国高端婴童品牌:Hanna Andersson
2016/10/30 全球购物
FitFlop澳大利亚官网:英国符合人体工学的鞋类品牌
2017/06/05 全球购物
意大利咖啡、浓缩咖啡和浓缩咖啡机:illy caffe
2019/03/20 全球购物
瑞典度假品牌:OAS
2019/05/28 全球购物
德国自行车商店:Tretwerk
2019/06/21 全球购物
HttpServlet类中的主要方法都有哪些?各自的作用是什么?
2014/03/16 面试题
中学生学习生活的自我评价
2013/10/26 职场文书
绩效专员岗位职责
2013/12/02 职场文书
入学申请自荐信范文
2014/02/26 职场文书
副护士长竞聘演讲稿
2014/04/30 职场文书
伦敦奥运会的口号
2014/06/21 职场文书
利用python Pandas实现批量拆分Excel与合并Excel
2021/05/23 Python
Python中异常处理用法
2021/11/27 Python