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;
}