>  기사  >  백엔드 개발  >  선주문 및 순차 순회 결과를 기반으로 PHP에서 이진 트리를 재구성하는 방법(코드)

선주문 및 순차 순회 결과를 기반으로 PHP에서 이진 트리를 재구성하는 방법(코드)

不言
不言앞으로
2018-09-28 16:02:501876검색

이 문서의 내용은 선주문 및 순차 순회 결과를 기반으로 PHP가 이진 트리(코드)를 재구성하는 방법에 대한 것입니다. 필요한 친구가 참고할 수 있기를 바랍니다. 당신에게 도움이 되십시오.

이진 트리의 선순 순회 및 순차 순회 결과를 입력하고 이진 트리를 재구성하세요. 입력된 선순순회와 순순순회 결과에 반복되는 숫자가 포함되지 않는다고 가정한다. 예를 들어 선순 순회 시퀀스 {1,2,4,7,3,5,6,8}과 순차 순회 시퀀스 {4,7,2,1,5,3,8을 입력하면 ,6}, 이진 트리를 재구성하고 반환합니다. ... 왼쪽 하위 트리입니다. 루트 노드 오른쪽에 있는 오른쪽 하위 트리가 오른쪽 하위 트리입니다.
3. 0 위치를 제외하고 1에서 왼쪽 하위 트리 번호 위치로 순회합니다. 는 왼쪽 하위 트리이고 나머지는 오른쪽 하위 트리입니다.
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 cnblogs.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제