この記事の内容は、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 サイトの他の関連記事を参照してください。