PHP 는 이 진 트 리 깊이 우선 옮 겨 다 니 기(앞 순서,가운데 순서,뒤 순서)와 너비 우선 옮 겨 다 니 기(차원)인 스 턴 스 상세 설명 을 실현 합 니 다.
선언:
깊이 우선 옮 겨 다 니 기:모든 가능 한 분기 경 로 를 더 이상 깊이 들 어 갈 수 없 을 때 까지 깊이 들 어가 고 모든 노드 는 한 번 만 방문 할 수 있 습 니 다.특히 주의해 야 할 것 은 이 진 트 리 의 깊이 는 우선 옮 겨 다 니 는 것 이 특수 하 므 로 먼저 옮 겨 다 니 거나 중간 에 옮 겨 다 니 거나 뒤 를 옮 겨 다 니 는 것 으로 나 눌 수 있다.구체 적 인 설명 은 다음 과 같다.
앞 순서 옮 겨 다 니 기:뿌리 노드->왼쪽 트 리->오른쪽 트 리
중간 순서:왼쪽 하위 트 리->뿌리 노드->오른쪽 하위 트 리
뒤 순 옮 겨 다 니 기:왼쪽 하위 트 리->오른쪽 하위 트 리->뿌리 노드
넓 은 범위 우선 옮 겨 다 니 기:층 차 를 옮 겨 다 니 는 것 이 라 고도 부 릅 니 다.위 에서 아래로 각 층 을 순서대로 방문 합 니 다.각 층 에서 왼쪽 에서 오른쪽으로(오른쪽 에서 왼쪽으로)결점 을 방문 하고 한 층 을 방문 하면 다음 층 으로 들 어 갑 니 다.결점 이 없 을 때 까지 입 니 다.
예 를 들 어 이 나무 에 대해:
깊이 우선 순위:
이전 순서:10,8,7,9,12,11,13
역순:7,8,9,10,11,12,13
후 순 옮 김:7,9,8,11,13,12,10
우선 범위:
층 차 옮 김:10,8,12,7,9,11,13
이 진 트 리 의 깊이 를 우선 으로 옮 겨 다 니 는 비 재 귀적 인 방법 은 스 택 을 사용 하고 넓 은 범위 에서 우선 옮 겨 다 니 는 비 재 귀적 인 방법 은 대기 열 을 사용 합 니 다.
깊이 우선 순위:
1.앞 순 서 를 옮 겨 다 니 기:
/**
* ( )
*/
private function pre_order1($root)
{
if (!is_null($root)) {
// __FUNCTION__, , ,
$function = __FUNCTION__;
echo $root->key . " ";
$this->$function($root->left);
$this->$function($root->right);
}
}
/**
* ( )
* , 。 , 。
*/
private function pre_order2($root)
{
// $stack = new splstack();
// $stack->push($root);
// while(!$stack->isEmpty()){
// $node = $stack->pop();
// echo $node->key.' ';
// if(!is_null($node->right)){
// $stack->push($node->right);
// }
// if(!is_null($node->left)){
// $stack->push($node->left);
// }
// }
if (is_null($root)) {
return;
}
$stack = new splstack();
$node = $root;
while (!is_null($node) || !$stack->isEmpty()) {
while (!is_null($node)) {
// ,
$stack->push($node);
echo $node->key . ' ';
$node = $node->left;
}
$node = $stack->pop();
$node = $node->right;
}
}
//
public function PreOrder()
{
// tree
// $this->pre_order1($this->tree->root);
$this->pre_order2($this->tree->root);
}
설명:1.나 는 모든 옮 겨 다 니 는 방법 을 하나의 traverse 에 봉 했다.2、pre_order 2 방법 에서 스 택 을 사용 하 는 과정 에서 저 는 PHP 표준 라 이브 러 리 SPL 에서 제공 하 는 splstack 을 사 용 했 습 니 다.만약 에 배열 을 사용 하 는 습관 이 있다 면array_push()
과array_pop()
시 뮬 레이 션 을 사용 하여 실현 할 수 있 습 니 다.2.중간 순서 옮 겨 다 니 기:
/**
* ( )
*/
private function mid_order1($root)
{
if (!is_null($root)) {
$function = __FUNCTION__;
$this->$function($root->left);
echo $root->key . " ";
$this->$function($root->right);
}
}
/**
* ( )
* , 。 , 。
*/
private function mid_order2($root)
{
if (is_null($root)) {
return;
}
$stack = new splstack();
$node = $root;
while (!is_null($node) || !$stack->isEmpty()) {
while (!is_null($node)) {
$stack->push($node);
$node = $node->left;
}
$node = $stack->pop();
echo $node->key . ' ';
$node = $node->right;
}
}
//
public function MidOrder()
{
// $this->mid_order1($this->tree->root);
$this->mid_order2($this->tree->root);
}
3.뒤 순서 옮 겨 다 니 기:
/**
* ( )
*/
private function post_order1($root)
{
if (!is_null($root)) {
$function = __FUNCTION__;
$this->$function($root->left);
$this->$function($root->right);
echo $root->key . " ";
}
}
/**
* ( )
* , 。 , 。
* , lastVisited
*/
private function post_order2($root)
{
if (is_null($root)) {
return;
}
$node = $root;
$stack = new splstack();
//
$lastVisited = NULL;
$stack->push($node);
while(!$stack->isEmpty()){
$node = $stack->top();//
if(($node->left == NULL && $node->right == NULL) || ($node->right == NULL && $lastVisited == $node->left) || ($lastVisited == $node->right)){
echo $node->key.' ';
$lastVisited = $node;
$stack->pop();
}else{
if($node->right){
$stack->push($node->right);
}
if($node->left){
$stack->push($node->left);
}
}
}
}
//
public function PostOrder()
{
// $this->post_order1($this->tree->root);
$this->post_order2($this->tree->root);
}
우선 범위:1.차원 옮 겨 다 니 기:
/**
* ( )
* ,
*/
private function level_order1($root,$level){
if($root == NULL || $level < 1){
return;
}
if($level == 1){
echo $root->key.' ';
return;
}
if(!is_null($root->left)){
$this->level_order1($root->left,$level - 1);
}
if(!is_null($root->right)){
$this->level_order1($root->right,$level - 1);
}
}
/**
* ( )
*
, 。
*/
private function level_order2($root){
if(is_null($root)){
return;
}
$node = $root;
//
// $queue = array();
// array_push($queue,$node);
//
// while(!is_null($node = array_shift($queue))){
// echo $node->key.' ';
// if(!is_null($node->left)){
// array_push($queue,$node->left);
// }
// if(!is_null($node->right)){
// array_push($queue,$node->right);
// }
// }
$queue = new splqueue();
$queue->enqueue($node);
while(!$queue->isEmpty()){
$node = $queue->dequeue();
echo $node->key.' ';
if (!is_null($node->left)) {
$queue->enqueue($node->left);
}
if (!is_null($node->right)) {
$queue->enqueue($node->right);
}
}
}
//
public function LevelOrder(){
// $level = $this->getdepth($this->tree->root);
// for($i = 1;$i <= $level;$i ++){
// $this->level_order1($this->tree->root,$i);
// }
$this->level_order2($this->tree->root);
}
//
private function getdepth($root){
if(is_null($root)){
return 0;
}
$left = getdepth($root -> left);
$right = getdepth($root -> right);
$depth = ($left > $right ? $left : $right) + 1;
return $depth;
}
설명:levelorder 2 방법 에서 대기 열 을 사용 하 는 과정 에서 저 는 PHP 표준 라 이브 러 리 SPL 에서 제공 하 는 splqueue 를 사 용 했 습 니 다.만약 에 배열 을 사용 하 는 습관 이 있다 면array_push()
과array_shift()
시 뮬 레이 션 을 사용 하여 실현 할 수 있 습 니 다.사용:
이제 클 라 이언 트 코드 를 살 펴 보 겠 습 니 다.
class Client
{
public static function Main()
{
try {
//
function autoload($class)
{
include strtolower($class) . '.php';
}
spl_autoload_register('autoload');
$arr = array(10, 8, 12, 7, 9, 11, 13);
$tree = new Bst();
// $tree = new Avl();
// $tree = new Rbt();
$tree->init($arr);
$traverse = new traverse($tree);
$traverse->PreOrder();
// $traverse->MidOrder();
// $traverse->PostOrder();
// $traverse->LevelOrder();
} catch (Exception $e) {
echo $e->getMessage();
}
}
}
CLient::Main();
보충:1.클 라 이언 트 에서 사용 하 는 세 가지 유형의 Bst,Avl,Rbt 는 앞의 편 을 참고 할 수 있 습 니 다.PHP 는 이 진 트 리 그래 픽 디 스 플레이 기능 에 대한 상세 한 설명 을 구현 합 니 다.
2.왜 SPL 표준 라 이브 러 리 에서 제공 하 는
splstack
과splqueue
를 사용 하 는 것 을 추천 합 니까?이것 은 내 가 어떤 글 에서 본 것 이다.비록 우 리 는 전통 적 인 변수 유형 으로 데이터 구 조 를 묘사 할 수 있 지만,예 를 들 어 스 택(Strack)C 를 배열 로 묘사 한 다음 에 대응 하 는 방식 으로 pop 과 pusharray_pop()
,array_push()
를 사용 할 수 있 지만,너 는 항상 조심해 야 한다.데이터 구 조 를 설명 하 는 데 사용 되 는 C 가 아니 기 때문에 이 스 택 을 파괴 할 수 있 기 때문이다.반면 SPL 의 SplStack 대상 은 엄 격 히 스 택 형식 으로 데 이 터 를 설명 하고 이에 대응 하 는 방법 을 제공한다.또한 이러한 코드 는 특정한 배열 이 아 닌 스 택 을 조작 하고 있다 는 것 을 이해 하여 동료 들 이 해당 하 는 코드 를 잘 이해 하고 더욱 빠 를 수 있 을 것 입 니 다.원문 주소:PHP SPL,잃 어 버 린 보석3.본 논문 과 관련 된 참고 글:C 언어 이 진 트 리 에서 흔히 볼 수 있 는 조작 에 대한 상세 한 설명,자바 는 이 진 트 리 의 깊이 우선 스 트 리밍 과 너비 우선 스 트 리밍 알고리즘 예제 를 실현 합 니 다.
더 많은 PHP 관련 내용 에 관심 이 있 는 독자 들 은 본 사이트 의 주 제 를 볼 수 있다.
본 논문 에서 말 한 것 이 여러분 의 PHP 프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
laravel에 yo에서 angularJs&coffeescript를 사용할 수 있도록 한다.먼저 yo 명령을 사용할 수 있어야하므로 아래에서 설치 global에 설치한 곳에서 laravel의 프로젝트 루트로 이동. 클라이언트 코드를 관리하는 디렉토리를 만들고 이동합니다. 클라이언트 환경 만들기 이것으로 히...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.