1. 程式人生 > >設計一個演算法,判斷一個二叉樹是否為完全二叉樹

設計一個演算法,判斷一個二叉樹是否為完全二叉樹

思想:根據完全二叉樹的定義,對完全二叉樹按照從上到下、從左到右的層次遍歷,應該滿足一下兩條要求:

某節點沒有左孩子,則一定無右孩子

若某節點缺左或右孩子,則其所有後繼一定無孩子

若不滿足上述任何一條,均不為完全二叉樹。

演算法思路:採用層序遍歷演算法,用cm變數值表示迄今為止二叉樹為完全二叉樹(其初值為1,一旦發現不滿足上述條件之一,則置cm為0),bj變數值表示迄今為止所有節點均有左右孩子(其初值為1),一旦發現一個節點沒有左孩子或沒有右孩子時置bj為0),在遍歷完畢後返回cm的值。

對應的演算法如下:

int CompBTNode(BTNode * b)

{

BTNode *Qu[MaxSize],*p;//定義一個佇列,用於層次遍歷

int front=0,rear=0;//隊頭、隊尾指標

int cm=1;

int bj=1;

if(b!=NULL)

{

rear++;

Qu[rear]=b;//進隊

while(front!=rear)

{

front++;

p=Qu[front];

if(p->lchild==NULL)//*p節點沒有左孩子

{

bj=0;

if(p->rchild!=NULL)//沒有左孩子但有右孩子

cm=0;//則不是完全二叉樹

}

else//*p節點有左子樹

{

if(bj==1)//迄今為止,所有節點均有左右孩子

{

rear++;//左孩子進隊

Qu[rear]=b->lchild;

if(p->rchild==NULL)//*p有左孩子但沒有右孩子

bj=0;

else

{

rear++;//右孩子進隊

Qu[rear]=p->rchild;

}

else//bj=0:迄今為止,已有節點缺孩子

cm=0;//而此時*p節點有左孩子,違反(2)

}

}

return cm;

}

return 1;//把空樹當成特殊的完全二叉樹

}

相關推薦

設計一個演算法判斷一個是否完全

思想:根據完全二叉樹的定義,對完全二叉樹按照從上到下、從左到右的層次遍歷,應該滿足一下兩條要求: ●某節點沒有左孩子,則一定無右孩子 ●若某節點缺左或右孩子,則其所有後繼一定無孩子 若不滿足上述任何一

設計一個演算法一個十進位制的數轉化二進位制

#include<iostream.h> const int StackSize=10; class SeqStack {     public:        SeqStack(){

【資料結構 C描述】設計一個演算法用於檢測給定的字串是否對稱串。

【資料結構 C描述】設計一個演算法,用於檢測給定的字串是否為對稱串。 所謂對稱串,就是字串從左往右讀和從右往左讀的序列一樣。 例如: abccba是對稱串。 abcabc不是對稱串。 //main.cpp #include <iostream> #include

連結串列的方式建立一棵並以非遞迴演算法中序輸出;計算的繁茂度判斷是否完全

以二叉連結串列的方式存二叉樹,輸入時要以先序方式輸入,其中,空子樹用#表示。 二叉樹的繁茂度定義為其高度乘其每層結點最大值。演算法為先用遞迴演算法求二叉樹高度:其高度為左右子樹最大值加1,所以用先序遍歷,定義ld與rd分別為左右子樹高度,最後返回其較大值加1即可。二叉樹寬度

設計一個演算法一個字串進行二進位制編碼使得編碼後字串的長度最短。(哈弗曼編碼)

美團點評2016研發工程師程式設計題(二) 請設計一個演算法,給一個字串進行二進位制編碼,使得編碼後字串的長度最短。 輸入描述: 每組資料一行,為待編碼的字串。保證字串長度小於等於1000。 輸出描述: 一行輸出最短的編碼後長度。 輸入例子: MT-TECH-TEA

【Java面試】實現一個演算法確定一個字串的所有字元是否全都不同

//method to figure out if there's no duplicate char in a ASCII string import java.lang.String boolean isUniquedChars(String myString

Python練習題6(判斷是否迴文聯):編寫一個函式判斷傳入的字串引數是否“迴文聯”(迴文聯即用迴文形式寫成的對聯既可順讀也可倒讀。例如:上海自來水來自海上)

方法一:將字串分成兩半,將第一個和最後一個字元進行比較,若一樣則返回True.全部為True則為迴文聯 1 def isPalindrome(): 2 context = input("請輸入字串:") 3 len_half = len(context) // 2

一個巨集判斷整數的某位是否1

題目:一個位圖陣列:unsigned long BIT_MAP[MAX_SIZE],寫一個巨集,判斷其中第bit位是否為1#define IS_BIT_SET(BIT_MAP, bit) (((BIT_MAP[bit / sizeof(unsigned long)]) >

【資料結構週週練】014 利用棧和非遞迴演算法求鏈式儲存的是否完全

一、前言 首先,明天是個很重要的節日,以後我也會過這個節日,在這裡,提前祝所有程式猿們,猿猴節快樂,哦不,是1024程式設計師節快樂。 今天要給大家分享的演算法是判斷二叉樹是否為完全二叉樹,相信大家對完全二叉樹的概念並不陌生,如果是順序儲存就會很方便,那鏈式儲存怎麼判斷呢,我的做法是:若

判斷一顆是否完全

題目連結:https://oj.ismdeep.com/contest/problem?id=1396&pid=7 H: CBT? 時間限制: 1 s      記憶體限制: 128 MB  &n

【資料結構】判斷一棵是否完全

完全二叉樹(Complete Binary Tree) 若設二叉樹的深度為h,除第h層外,其它各層(1~h-1)的結點數都達到最大個數,第h層所有的結點都連續集中在最左邊,這就是完全二叉樹。 完全二叉樹是由滿二叉樹而引出來的。對於深度為K的,有n個結點的二叉樹,當且僅當其每

資料結構——判斷是否完全

該方法採取層次遍歷(回憶層次遍歷的實現需要藉助一個佇列,一邊進隊一邊出隊,在出隊的同時對結點進行visit())對於完全二叉樹來說,當訪問到空結點時說明該樹已經完結,之後佇列中也將一直為空。但非完全的二叉樹在空結點之後仍有可能出現數據。根據這個不同,只需正常層次遍歷,在出隊遇

映象(遞迴和非遞迴)+ 判斷一棵是否是平衡+ 判斷一棵是否完全

二叉樹映象(遞迴和非遞迴): // 求二叉樹的映象:非遞迴 void GetBinaryMirror_Nor() { if(_pRoot == NULL) return; stack<Node*> s; s.push(_pRoot);

自學演算法判斷一個是否平衡/搜尋/完全

話不多說,在面試中遇到過,一臉矇蔽,被虐出翔…以下所述,僅僅是手撕程式碼時候使用,若是需要線上程式設計,可以根據該思路編寫對應AC程式碼。 如何判斷一個二叉樹是否平衡?要解決這個問題,首先要知道什麼

題目描述 在一個二維數組中(每個一維數組的長度相同)每一行都按照從左到右遞增的順序排序每一列都按照從上到下遞增的順序排序。請完成一個函數輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數。

這樣的 -i 一個 整數 描述 輸入 遞增 lse i+1 題目描述 在一個二維數組中(每個一維數組的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數。 1

設計一個演算法刪除遞增有序連結串列中值大於mink且小於maxk的所有元素(mink和maxk是給定的兩個引數其值可以和表中的元素相同也可以不同)。

語言:C++ #include <iostream> using namespace std; typedef struct LNode { int data; LNode *next; }LNode,*LinkList; //建立連結串列 int CreateList(Li

設計一個演算法將連結串列中所有結點的連結串列方向“原地”逆轉即要求僅利用原表的儲存空間換句話說要求演算法的空間複雜度O(1)。

語言:C++ #include <iostream> using namespace std; typedef struct LNode { int data; LNode *next; }LNode,*LinkList; //建立連結串列 int CreateList(Li

設計一個演算法通過一趟遍歷確定長度n的單鏈表中值最大的結點。

語言:C++ #include <iostream> using namespace std; typedef int Elemtype; typedef struct LNode { Elemtype data; struct LNode *next; }LNode,*Lin

已知兩個連結串列A和B分別表示兩個集合其元素遞增排列。請設計一個演算法用於求出A與B的交集並存放在A連結串列中。

語言:C++ #include <iostream> using namespace std; typedef struct LNode { int data; LNode *next; }LNode,*LinkList; //建立連結串列 int CreateList(Li

給定陣列a[0:n-1]試設計一個演算法在最壞情況下用[3n/2 -2 ] 次比較找出a[0:n-1]中元素的最大值和最小值;教材2-15

給定陣列a[0:n-1]試設計一個演算法,在最壞情況下用[3n/2 -2 ] 次比較找出a[0:n-1]中元素的最大值和最小值; 解:要求對於陣列用小於【3n/2-2】的比較次數找到兩個最值 可以用陣列第一個元素來初始化max,min 然後遍歷陣列,分別和max,min比較,一遍就可以找