ホームページ  >  記事  >  バックエンド開発  >  PHP は、非再帰アルゴリズムに基づいて、事前順序/順序内/順序後トラバーサル バイナリ ツリー操作を実装します。

PHP は、非再帰アルゴリズムに基づいて、事前順序/順序内/順序後トラバーサル バイナリ ツリー操作を実装します。

不言
不言オリジナル
2018-04-26 16:18:011566ブラウズ

この記事では主に、非再帰アルゴリズムに基づいた PHP のプリオーダー/インオーダー/ポストオーダー トラバーサル バイナリ ツリー操作の実装を紹介します。これは、必要な友人と共有します。

/**
 * PHP基于非递归方式算法实现先序/中序/后序遍历二叉树操作
 *          A
 *       B      C
 *    D    E  F     G
 *  H  
  * 先序遍历:先遍历根节点,然后遍历左节点,最后遍历右节点: ABDHECFG 
 * 中序遍历:先遍历左子树,然后遍历根节点,最后遍历右子树:  HDBEAFCG
 * 后序遍历:先遍历左子树,然后遍历右子树,最后遍历根节点: HDEBFGCA
 *  */


/*先序遍历:利用栈的先进后出特性,先访问根节点,再把右子树压入,再压入左子树.这样取出的时候是先取出左子树,最后取出右子树*/
  function preOrder($root){
  $stack = array();
  array_push($stack,$root);
  while(!empty($stack)){
  $center_node = array_pop($stack);
  echo $center_node->value;//根节点
  if($center_node->right != null){
  array_push($stack,$center_node->right);//压入右子树
  }
  if($center_node->left != null){
  array_push($stack,$center_node->left);//压入左子树
  }
  }
  }


  /*中序遍历:需要从下向上遍历,所以先把左子树压入栈,然后逐个访问根节点和右子树*/
 function inOrder($root){
 $stack = array();
 $center_node = $root;
 while(!empty($stack) || $center_node != null){
      while($center_node != null ){
      array_push($stack,$center_node);
      $center_node = $center_node->left;
      }
      $center_node = array_pop($stack);
      echo $center_node->value;
      $center_node = $center_node->right;
 }
 }


 /*后序遍历:先把根节点存起来,然后依次存储左子树和右子树,然后输出*/


 function tailOrder($root){
 $stack = array();
 $outStack = array();
 array_push($$stack, $root);
 while($empty($stack)){
 $center_node = array_pop($stack);
 array_push($outStack,$center_node);
 if($center_node->right != null){
 array_push($stack,$center_node->left);
 }
 }
 while($empty($outStack)){
 echo $center_node->value;
 }
 }

関連する推奨事項:

PHPはSPLに基づいて反復子モードを実装します

PHPがphpqrcodeクラスに基づいてQRコードを生成する方法の詳細な説明

PHPはオブジェクト指向に基づいてゲストブック関数を実装します

以上がPHP は、非再帰アルゴリズムに基づいて、事前順序/順序内/順序後トラバーサル バイナリ ツリー操作を実装します。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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