一.問題描述
有一棵樹判斷該樹是否是完全二叉樹?
二.問題分析
1.完全二叉樹的定義?
判斷一棵樹是否是完全二叉樹,首先要知道什仫是完全二叉樹?完全二叉樹就是除最後一層外,每一層上的結點數均達到最大值;在最後一層上只缺少右邊的若干結點。
若設二叉樹的深度為h,除第 h 層外,其它各層 (1~h-1) 的結點數都達到最大個數,第 h 層所有的結點都連續集中在最左邊,這就是完全二叉樹。
完全二叉樹是由滿二叉樹而引出來的。對於深度為k的,有n個結點的二叉樹,當且僅當其每乙個結點都與深度為k的滿二叉樹中編號從1至n的結點一一對應時稱之為完全二叉樹。
一棵二叉樹至多只有最下面的兩層上的結點的度數可以小於2,並且最下層上的結點都集中在該層最左邊的若干位置上,則此二叉樹成為完全二叉樹。
2.如何判斷一棵樹是完全二叉樹?
在了解了完全二叉樹的概念之後,相信讀者應該都會判定一顆樹是否是完全二叉樹了,根據完全二叉樹的定義,我們知道完全二叉樹的前h-1是滿二叉樹,而最後一層又是從左到右沒有間隔的,如果對這棵樹進行層序遍歷會發生什仫情況呢?詳細介紹見下。在這裡我提到兩種判斷完全二叉樹的方法:
1).標記法
設定標記flag=false,如上圖所示,從根結點開始層序遍歷入佇列,如果佇列不為空,一直迴圈。遇到第乙個沒有左孩子或者右孩子的結點,設定標記位flag=true,如果繼續入佇列再次遇到存在孩子的結點一定不是完全二叉樹。
//設定標誌位的方法
bool iscompletebinarytree1()
return
true;
}
2).剩餘佇列判空法
突然發現使用上述標記法要考慮的情況很多,不太方便,於是又提出了另一種方法,就是剩餘佇列判空法
這個方法同樣的用到了佇列這種輔助結構,那仫如何只通過佇列這個結構來判斷一棵樹是否是完全二叉樹呢?試想一下,如果我們把一棵樹的所有結點,包括葉子結點的左右空孩子都通過層序遍歷入佇列會發生什仫情況?詳細的分析見下圖:
//利用輔助佇列的辦法
bool iscompletebinarytree2()
//如果佇列中全為null則是完全二叉樹,否則不是
while(!q.empty())
return
true;
}
三.完整的**實現
[cpp]view plain
copy
print?
template
struct binarytreenode
};
template
class binarytree
binarytree(const t*a,size_t size,const t& invalid)
//設定標誌位的方法
bool iscompletebinarytree1()
return
true;
} //利用輔助佇列的辦法
bool iscompletebinarytree2()
//如果佇列中全為null則是完全二叉樹,否則不是
while(!q.empty())
return
true;
} protected:
node* _creattree(const t*a,size_t size,size_t& index,const t& invalid)
return root;
} protected:
node *_root;
};
void testiscompletetree()
; //false
//int array=; //true
//int array=; //true
int array=;
size_t size=sizeof(array)/sizeof(array[0]);
binarytree bt(array,size,'#');
bool ret=bt.iscompletebinarytree2();
if(ret == true)
cout<
cout<
判斷一棵樹是否是平衡二叉樹
題目 程式設計題 平衡二叉樹 時間限制 1000 ms,記憶體限制 256000 kb,長度限制 8000 b 判斷乙個二叉樹是不是平衡 說明 一棵二叉樹任意乙個節點的左右子樹的深度差不大於1,即為平衡二叉樹。給定乙個有n個節點的二叉樹,每個節點有乙個序號表示,樹有m條分支。每個分支用三個數字a b...
判斷一棵樹是否是完全二叉樹
1 基礎知識 二叉樹 二叉樹是一棵特殊的樹,二叉樹每個節點最多有兩個孩子結點,分別稱為左孩子和右孩子。滿二叉樹 高度為n的滿二叉樹有2 n 1個節點的二叉樹。完全二叉樹 若設二叉樹的深度為h,除第h 層外,其它各層 1 h 1 的結點數都達到最大個數,第h 層所有的結點都連續集中在最左邊,這就是完全...
判斷一棵樹是否是完全二叉樹
一邊對二叉樹進行bfs將每乙個節點都加入到佇列,一邊執行下面的判斷 當前節點有右孩子,但沒有左孩子,直接返回false 當前節點有左孩子沒右孩子 或者 當前結點左孩子右孩子都沒有,那麼接下來遇到的所有節點必須是葉子節點 public static boolean check node head if...