ホームページ >バックエンド開発 >PHPチュートリアル >PHPを使用してバイナリツリーをソートする方法

PHPを使用してバイナリツリーをソートする方法

php中世界最好的语言
php中世界最好的语言オリジナル
2018-05-28 09:53:522035ブラウズ

今回は、PHP を使用してバイナリ ツリーをソートする方法と、PHP を使用してバイナリ ツリーをソートするときの 注意事項 を​​説明します。以下は実際的なケースです。

ここでは、ソートされたバイナリ ツリー ノードの挿入、順序トラバーサル、極値検索、特定値検索の機能を示します。

基本的に概念や定義は提供されていません。ここで提供されるいくつかの概念を簡単に理解することをお勧めします。この記事を読んでください。

実際には、コードが提供されているだけで、

コメントはほとんどありません お疲れ様です。各ノードが最大 2 つのサブツリーを持つ構造。

ソートされた二分木: 左の子ノードの値は親ノードの値より小さく、右の子ノードの値は親ノードの値より大きい

いくつかの概念:

ルートノード

リーフノード

左の子ツリー

右の子ツリー
順序トラバーサル

事前順序トラバーサル
事後トラバーサル
二分木探索



順序トラバーサル:

最初に左側をトラバースしますサブツリーを作成し、このノードをトラバースし、次に右のノードをトラバースします。トラバース後の結果はソートです。

// 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 中国語 Web サイトの他の関連記事にご注目ください。


推奨書籍:

JS 配列と JSON オブジェクトを動的に追加、変更、削除する方法

Vue+Nuxt.js を使用してサーバーサイド レンダリングを実装する方法

以上がPHPを使用してバイナリツリーをソートする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。