欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

PHP排序二叉树基本功能实现方法示例

程序员文章站 2022-11-23 17:11:23
本文实例讲述了php排序二叉树基本功能实现方法。分享给大家供大家参考,具体如下: 这里演示了排序二叉树节点的插入,中序遍历,极值的查找和特定值的查找的功能. 基本没有提...

本文实例讲述了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程序设计算法总结》、《php字符串(string)用法总结》、《php数组(array)操作技巧大全》、《php常用遍历算法与技巧总结》及《php数学运算技巧总结

希望本文所述对大家php程序设计有所帮助。