二叉樹的層次遍歷和最大寬度

1、二叉樹的層次遍歷。

  二叉樹的層序遍歷的實現還是比較簡單的,由於其層級的關係,很明顯要用到隊列來輔助實現,主要是從左向右,自上而下,依次將二叉樹的各節點入隊,這樣便可以保證輸出的順序是層序排列的。下面是算法的實現思想:

    先將樹的根節點入隊,

    如果隊列不空,則進入循環

    {

      將隊首元素出隊,並輸出它;

      如果該隊首元素有左孩子,則將其左孩子入隊;

      如果該隊首元素有右孩子,則將其右孩子入隊

    }



/**
 * 二叉樹的層次遍歷。
 */ 


function breathNode($node){
$queue=array();
array_unshift($queue,$node);
while(!empty($queue)){
$root=array_pop($queue);
echo $root->data.' ';
if($root->left!=null){
array_unshift($queue,$root->left);
}
if($root->right!=null){
array_unshift($queue,$root->right);
}
}
}



2 二叉樹的寬度

題目: 
給定一顆二叉樹,求二叉樹的寬度。

寬度的定義: 
二叉樹的寬度定義爲具有最多結點數的層中包含的結點數。

這裏寫圖片描述

比如上圖中,第1層有1個節點, 第2層有2個節點, 第3層有4個節點, 第4層有1個節點,可知,第3層的結點數最多,所以這棵二叉樹的寬度就是4。

求解思路: 

這裏需要用到二叉樹的層次遍歷,即廣度優先周遊。在層次遍歷的過程中,通過讀取隊列中保留的上一層的節點數來記錄每層的節點數,以獲取所有層中最大的節點數。關於二叉樹的廣度優先周遊,參考

/*
 * 獲取二叉樹的最大寬度。
 */
function getBreathNodeWidt($node){
$queue=array();
array_unshift($queue,$node);
$lastWidth=1;//用於記錄上一層的寬度。
$curWidth=1; //用於記錄當前層的寬度。
$maxWidth=0;//用戶記錄二叉樹的最大寬度。
if($node==null){
$bigWidth=0;
}
if($node->left==null && $node->right==null){
$bigWidth=1;
}
while(!empty($queue)){
while($lastWidth!=0){
$root=array_pop($queue);
echo $root->data.' ';
if($root->left!=null){
array_unshift($queue,$root->left);
}
if($root->right!=null){
array_unshift($queue,$root->right);
}
$lastWidth--;
}
$curWidth=sizeof($queue);
$maxWidth=$curWidth>$maxWidth?$curWidth:$maxWidth;
$lastWidth=$curWidth;
}
return $maxWidth;
}





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章