設計一個演算法,判斷一個二叉樹是否為完全二叉樹
思想:根據完全二叉樹的定義,對完全二叉樹按照從上到下、從左到右的層次遍歷,應該滿足一下兩條要求:
●某節點沒有左孩子,則一定無右孩子
●若某節點缺左或右孩子,則其所有後繼一定無孩子
若不滿足上述任何一條,均不為完全二叉樹。
演算法思路:採用層序遍歷演算法,用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比較,一遍就可以找