二叉樹經典面試題4 判斷一棵樹是否是完全二叉樹

2021-08-04 10:59:44 字數 2533 閱讀 1684

一.問題描述

有一棵樹判斷該樹是否是完全二叉樹?

二.問題分析

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...