資料結構之判斷一棵樹是不是完全二叉樹

2021-09-29 02:29:11 字數 1616 閱讀 4211

完全二叉樹是由 滿二叉樹 而引出來的。對於深度為k的,有n個結點的二叉樹,當且僅當其每乙個結點都與深度為k的滿二叉樹中編號從1至n的結點一一對應時稱之為完全二叉樹。

如下就是完全二叉樹

1

2 3

4 5 6 7

如下就是完全二叉樹

1

2 3

4 5

如下不是完全二叉樹

1

2 3

4 5 7

判斷一顆二叉樹是不是完全二叉樹,我們用層遍歷數(這裡需要用到佇列)

1)如果根節點為null, 返回false,不是的話,我們queue把根節點push到裡面去,然後在放到queue大小不為空的迴圈裡面,進行queue.front()操作得到節點。

2)如果節點的左葉子是空,右葉子節點不是空,直接返回false。

3)如果節點的左葉子不是空,右葉子節點不是空,我們分別把左右葉子節點壓去queue,同時pop出最前面的元素。

4)如果遇到乙個結點,左葉子不為空,右葉子為空;或者左右葉子都為空;則該節點之後的佇列中的結點都為葉子節點;該樹才是完全二叉樹,否則就不是完全二叉樹

#include #include using namespace std;

typedef struct tree

} tree;

bool iscompletetree(tree* node)

//左葉子不為空,右葉子為空;或者左右葉子都為空;則該節點之後的佇列中的結點都為葉子節點;該樹才是完全二叉樹,否則就不是完全二叉樹

if ((pnode->left == null && pnode->right == null) || (pnode->left != null && pnode->right == null))

queue.pop();

while (!queue.empty())

else

}return true;}}

return true;

}int main()

tree isfulltree is true
完全二叉樹如果遇到乙個結點,左葉子不為空,右葉子為空;或者左右葉子都為空;則該節點之後的佇列中的結點都為葉子節點;該樹才是完全二叉樹,否則就不是完全二叉樹

完全二叉樹還有這個性質,比如這個樹有n個節點,那麼這個樹的有左右孩子節點的父節點有n / 2個,如果我們堆頂是從下標0開始的,那麼n / 2個數就對於於下標0~ (n / 2 - 1),而且如果當前節點是下標i的話(有左右子節點情況),那麼它的左孩子節點的下標是2*i + 1,右孩子節點下標是2 * i + 2, 如果我們堆頂是從下標1開始的,那麼n / 2個數就對於於下標0~ (n / 2),而且如果當前節點是下標i的話(有左右子節點情況),那麼它的左孩子節點的下標是2*i ,右孩子節點下標是2 * i + 1, 

如何判斷一棵樹是不是另一棵樹的子樹

package suanfatest class treenode treenode int value treenode int value,treenode leftchild,treenode rightchild public int getvalue public void setvalu...

判斷一棵樹是不是完全二叉樹

還有一種特殊的完全二叉樹就是葉子節點都在同一層的,如下圖 完全二叉樹定義,若設二叉樹的深度為h,除第 h 層外,其它各層 1 h 1 的結點數都達到最大個數,第 h 層所有的結點都連續集中在最左邊,這就是完全二叉樹。思路是 用bfs,一層一層的遍歷二叉樹的節點,一但遍歷到空節點,那麼不在往佇列裡加入...

判斷一棵樹是不是完全二叉樹

分析 假設一棵樹是完全二叉樹,層數為k,那麼可以得到以下結論 1.前k 1層節點肯定都是飽和的,即到達了最大值 2.第k 1層不一定所有的節點都有孩子節點,如果有孩子節點,那麼一定是左孩子節點。所以我們要先找到第乙個孩子不全的節點,如果只有右孩子節點,那麼一定不是完全二叉樹。找到第乙個不飽和節點後,...