ホームページ > バックエンド開発 > PHPチュートリアル > 事前順序および順序内トラバーサルの結果に基づいて PHP でバイナリ ツリーを再構築する方法 (コード)

事前順序および順序内トラバーサルの結果に基づいて PHP でバイナリ ツリーを再構築する方法 (コード)

不言
リリース: 2023-04-04 08:24:02
転載
1883 人が閲覧しました

この記事の内容は、PHP が事前順序および順序トラバーサルの結果に基づいてバイナリ ツリー (コード) を再構築する方法に関するものです。一定の参考価値があります。必要な友人が参照できると幸いです。それはあなたに役立ちます。助けてください。

二分木の事前順走査と順走査の結果を入力し、二分木を再構築してください。入力された事前順序トラバーサルおよび順序内トラバーサルの結果には、繰り返しの数値が含まれていないと想定されます。たとえば、前順走査シーケンス {1,2,4,7,3,5,6,8} と順走走査シーケンス {4,7,2,1,5,3,8 を入力した場合,6}、次にバイナリ ツリーを再構築して戻ります。
1. 前次トラバーサルは中央、左、右、中間次トラバーサルは左、中央、右です
2. 前次トラバーサルの最初のノードはルート ノードであり、中間次トラバーサルはルート ノードです。配列は先頭からルートまでです。すべてのノードは左のサブツリーです。左のサブツリーの数がわかります。ルート ノードの右にある右のサブツリーが右のサブツリーです。
3. 0 を除く事前順序走査1 から左のサブツリーの数までの位置は左のサブツリー、その他は右のサブツリーです。
4 4 つの配列、前置左サブツリー配列、前置右サブツリー配列、順列左サブツリー配列、順列配列を決定します。右サブツリー配列; 再帰呼び出し

reConstructBinaryTree(pre,in)
    if(pre.length) return null//递归终止条件
    root=pre[0]
    Node=new Node(root)
    //在中序中找根结点的位置
    p=0
    for p;p<pre.length;p++
        if in[p]==root break
    for i=0;i<pre.length;i++
        
        if i<p
            //中序左子树数组
            inLeft[]=in[i]
            //前序左子树数组
            preLeft[]=pre[i+1]
        else if i>p
            //中序的右子树
            inRight[]=in[i]
            //前序的右子树
            preRight[]=pre[i]
    Node->left=reConstructBinaryTree(preLeft,inLeft)
    Node->right=reConstructBinaryTree(preRight,inRight)
    return Node
ログイン後にコピー
<?php
class TreeNode{
    var $val;
    var $left = NULL;
    var $right = NULL;
    function __construct($val){
        $this->val = $val;
    }   
};
function reConstructBinaryTree($pre, $vin){
        $len=count($pre);
        if($len==0){
                return null;
        }   
        $root=$pre[0];
        $node=new TreeNode($root);
        for($p=0;$p<$len;$p++){
                if($vin[$p]==$root){
                        break;
                }   
        }   
        $preLeft=array();
        $preRight=array();
        $vinLeft=array();
        $vinRight=array();
        for($i=0;$i<$len;$i++){
                if($i<$p){
                        $preLeft[]=$pre[$i+1];
                        $vinLeft[]=$vin[$i];
                }else if($i>$p){
                        $preRight[]=$pre[$i];
                        $vinRight[]=$vin[$i];
                }   
        }   
        $node->left=reConstructBinaryTree($preLeft,$vinLeft);
        $node->right=reConstructBinaryTree($preRight,$vinRight);
        return $node;
}
$pre=array(1,2,4,7,3,5,6,8);
$vin=array(4,7,2,1,5,3,8,6);
$node=reConstructBinaryTree($pre,$vin);;
var_dump($node);
ログイン後にコピー
object(TreeNode)#1 (3) {
  ["val"]=>
  int(1)
  ["left"]=>
  object(TreeNode)#2 (3) {
    ["val"]=>
    int(2)
    ["left"]=>
    object(TreeNode)#3 (3) {
      ["val"]=>
      int(4)
      ["left"]=>
      NULL
      ["right"]=>
      object(TreeNode)#4 (3) {
        ["val"]=>
        int(7)
        ["left"]=>
        NULL
        ["right"]=>
        NULL
      }
    }
    ["right"]=>
    NULL
  }
  ["right"]=>
  object(TreeNode)#5 (3) {
    ["val"]=>
    int(3)
    ["left"]=>
    object(TreeNode)#6 (3) {
      ["val"]=>
      int(5)
      ["left"]=>
      NULL
      ["right"]=>
      NULL
    }
    ["right"]=>
    object(TreeNode)#7 (3) {
      ["val"]=>
      int(6)
      ["left"]=>
      object(TreeNode)#8 (3) {
        ["val"]=>
        int(8)
        ["left"]=>
        NULL
        ["right"]=>
        NULL
      }
      ["right"]=>
      NULL
    }
  }
}
ログイン後にコピー

以上が事前順序および順序内トラバーサルの結果に基づいて PHP でバイナリ ツリーを再構築する方法 (コード)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
php
ソース:cnblogs.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート