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 文件类型判断代码
Mar 13 PHP
php 购物车的例子
May 04 PHP
纯php打造的tab选项卡效果代码(不用js)
Dec 29 PHP
多个PHP中文字符串截取函数
Nov 12 PHP
使用GDB调试PHP代码,解决PHP代码死循环问题
Mar 02 PHP
PHP生成和获取XML格式数据的方法
Mar 04 PHP
php字符集转换
Jan 23 PHP
利用PHPExcel读取Excel的数据和导出数据到Excel
May 12 PHP
php表单处理操作
Nov 16 PHP
PHP attributes()函数讲解
Feb 03 PHP
php实现 master-worker 守护多进程模式的实例代码
Jul 20 PHP
php生成短网址/短链接原理和用法实例分析
May 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与flash as3 socket通信传送文件实现代码
2014/08/16 PHP
PHP生成唯一订单号的方法汇总
2015/04/16 PHP
PHP设计模式之工厂模式定义与用法详解
2018/04/03 PHP
ie 调试javascript的工具
2009/04/29 Javascript
javascript下string.format函数补充
2010/08/24 Javascript
JS的千分位算法实现思路
2013/07/31 Javascript
javascript完美拖拽的实现方法
2013/09/29 Javascript
JQuery实现简单的图片滑动切换特效
2015/11/22 Javascript
基于jQuery实现拖拽图标到回收站并删除功能
2015/11/25 Javascript
基于vue.js实现侧边菜单栏
2017/03/20 Javascript
iOS + node.js使用Socket.IO框架进行实时通信示例
2017/04/14 Javascript
JS中的算法与数据结构之集合(Set)实例详解
2019/08/20 Javascript
vue 路由子组件created和mounted不起作用的解决方法
2019/11/05 Javascript
微信小程序网络请求实现过程解析
2019/11/06 Javascript
vue实现导航标题栏随页面滚动渐隐渐显效果
2020/03/12 Javascript
JS闭包原理及其使用场景解析
2020/12/03 Javascript
[00:14]PWL:老朋友Mushi拍VLOG与中国玩家问好
2020/11/04 DOTA
[22:07]DOTA2-DPC中国联赛 正赛 iG vs Magma 选手采访
2021/03/11 DOTA
Python collections模块实例讲解
2014/04/07 Python
在Python中使用dict和set方法的教程
2015/04/27 Python
Python数据结构与算法之图的基本实现及迭代器实例详解
2017/12/12 Python
python3 selenium自动化测试 强大的CSS定位方法
2019/08/23 Python
Python 窗体(tkinter)下拉列表框(Combobox)实例
2020/03/04 Python
Python调用OpenCV实现图像平滑代码实例
2020/06/19 Python
纯css实现照片墙3D效果的示例代码
2017/11/13 HTML / CSS
Oakley西班牙官方商店:太阳眼镜和男女运动服
2019/04/26 全球购物
北美最大的零售退货翻新商:VIP Outlet
2019/11/21 全球购物
node中使用shell脚本的方法步骤
2021/03/23 Javascript
庆八一活动方案
2014/01/25 职场文书
党的群众路线教育实践活动批评与自我批评
2014/02/16 职场文书
我的长生果教学反思
2014/04/28 职场文书
空气的环保标语
2014/06/12 职场文书
教师工作自我鉴定范文
2014/09/14 职场文书
2015年健康教育工作总结
2015/04/10 职场文书
投诉信格式范文
2015/07/02 职场文书
解决Springboot PostMapping无法获取数据的问题
2022/05/06 Java/Android