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中操作MySQL数据库的一些要注意的问题
Oct 09 PHP
第五节--克隆
Nov 16 PHP
php使用fopen创建utf8编码文件的方法
Oct 31 PHP
php实现图片添加描边字和马赛克的方法
Dec 10 PHP
PHP动态地创建属性和方法, 对象的复制, 对象的比较,加载指定的文件,自动加载类文件,命名空间
May 06 PHP
PHP 在数组中搜索给定的简单实例 array_search 函数
Jun 13 PHP
php实现xml转换数组的方法示例
Feb 03 PHP
php获取手机端的号码以及ip地址实例代码
Sep 12 PHP
PHP5.6读写excel表格文件操作示例
Feb 26 PHP
PHP For循环字母A-Z当超过26个字母时输出AA,AB,AC
Feb 16 PHP
php与阿里云短信接口接入操作案例分析
May 27 PHP
php提高脚本性能的4个技巧
Aug 18 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中文件上传的一个问题
2010/09/04 PHP
PHP CURL CURLOPT参数说明(curl_setopt)
2013/09/30 PHP
PHP+shell实现多线程的方法
2015/07/01 PHP
深入理解PHP中的empty和isset函数
2016/05/26 PHP
php 判断IP为有效IP地址的方法
2018/01/28 PHP
[原创]网络复制内容时常用的正则+editplus
2006/11/30 Javascript
让div层随鼠标移动的实现代码 ie ff
2009/12/18 Javascript
js数组Array sort方法使用深入分析
2013/02/21 Javascript
jQuery使用一个按钮控制图片的伸缩实现思路
2013/04/19 Javascript
判断iframe里的页面是否加载完成
2014/06/06 Javascript
jQuery中parent()方法用法实例
2015/01/07 Javascript
JS中多种方式创建对象详解
2016/03/22 Javascript
Angular 4依赖注入学习教程之InjectToken的使用(八)
2017/06/04 Javascript
webpack实现热更新(实施同步刷新)
2017/07/28 Javascript
EasyUI的TreeGrid的过滤功能的解决思路
2017/08/08 Javascript
D3.js实现拓扑图的示例代码
2018/06/30 Javascript
js的新生代垃圾回收知识点总结
2019/08/22 Javascript
vux-scroller实现移动端上拉加载功能过程解析
2019/10/08 Javascript
通过js实现压缩图片上传功能
2020/02/25 Javascript
javascript实现简易数码时钟
2020/03/30 Javascript
Python中的is和id用法分析
2015/01/26 Python
Python中使用PIL库实现图片高斯模糊实例
2015/02/08 Python
PyQt5实现拖放功能
2018/04/25 Python
python中datetime模块中strftime/strptime函数的使用
2018/07/03 Python
python 对txt中每行内容进行批量替换的方法
2018/07/11 Python
Python实现将HTML转成PDF的方法分析
2019/05/04 Python
Python初学者常见错误详解
2019/07/02 Python
英国最大的汽车配件在线商店:Euro Car Parts
2019/09/30 全球购物
实习销售业务员自我鉴定
2013/09/21 职场文书
综合素质的自我鉴定
2013/10/07 职场文书
银行出纳岗位职责
2013/11/25 职场文书
快餐店的创业计划书范文
2014/01/29 职场文书
运动会通讯稿150字
2014/02/15 职场文书
房产转让协议书
2014/04/11 职场文书
《小动物过冬》教学反思
2014/04/17 职场文书
办公室文员岗位职责
2015/02/04 职场文书