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 11 PHP
php使用cookie保存登录用户名的方法
Jan 26 PHP
基于linnux+phantomjs实现生成图片格式的网页快照
Apr 15 PHP
基于PHP实现的事件机制实例分析
Jun 18 PHP
PHP中如何防止外部恶意提交调用ajax接口
Apr 11 PHP
今天你说520了吗?不仅有php表白书还有java表白神器
May 20 PHP
php fseek函数读取大文件两种方法
Oct 12 PHP
基于php实现的php代码加密解密类完整实例
Oct 12 PHP
php 从指定数字中获取随机组合的简单方法(推荐)
Apr 05 PHP
PHP+JS实现的实时搜索提示功能
Mar 13 PHP
thinkPHP3.2.3结合Laypage实现的分页功能示例
May 28 PHP
PHP实现微信公众号验证Token的示例代码
Dec 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.NET的入门教程
2006/10/09 PHP
采用thinkphp自带方法生成静态html文件详解
2014/06/13 PHP
PHP彩蛋信息介绍和阻止泄漏的方法(隐藏功能)
2014/08/06 PHP
Laravel-添加后台模板AdminLte的实现方法
2019/10/08 PHP
jQuery实现切换页面布局使用介绍
2011/10/09 Javascript
简单的jQuery入门指引
2015/07/28 Javascript
js实现浮动在网页右侧的简洁QQ在线客服代码
2015/09/04 Javascript
举例说明如何为JavaScript的方法参数设置默认值
2015/11/17 Javascript
js和C# 时间日期格式转换的简单实例
2016/05/28 Javascript
详解Node.js如何开发命令行工具
2016/08/14 Javascript
JavaScript里 ==与===区别详解
2016/08/16 Javascript
Vue.js结合bootstrap实现分页控件
2017/03/10 Javascript
基于mpvue的小程序项目搭建的步骤
2018/05/22 Javascript
详解Vue SSR( Vue2 + Koa2 + Webpack4)配置指南
2018/11/13 Javascript
angularjs实现table表格td单元格单击变输入框/可编辑状态示例
2019/02/21 Javascript
详解Vue中使用插槽(slot)、聚类插槽
2019/04/12 Javascript
uni-app自定义导航栏按钮|uniapp仿微信顶部导航条功能
2019/11/12 Javascript
vue router返回到指定的路由的场景分析
2020/11/10 Javascript
[01:04:39]OG vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
Python连接PostgreSQL数据库的方法
2016/11/28 Python
用Python实现随机森林算法的示例
2017/08/24 Python
python3获取两个日期之间所有日期,以及比较大小的实例
2018/04/08 Python
python检测主机的连通性并记录到文件的实例
2018/06/21 Python
python二进制文件的转译详解
2019/07/03 Python
简单分析python的类变量、实例变量
2019/08/23 Python
python环境下安装opencv库的方法
2020/03/05 Python
Python基于xlrd模块处理合并单元格
2020/07/28 Python
中国宠物用品商城:E宠商城
2016/08/27 全球购物
Vince官网:全球著名设计师品牌,休闲而优雅的服饰
2017/01/15 全球购物
怎样写好自荐信和推荐信
2013/12/26 职场文书
关于护士节的演讲稿
2014/05/26 职场文书
技术负责人岗位职责
2015/02/10 职场文书
2016春节慰问信范文
2015/03/25 职场文书
专职安全员岗位职责
2015/04/11 职场文书
工作会议简报
2015/07/20 职场文书
Nginx工作原理和优化总结。
2021/04/02 Servers