1. 程式人生 > >【資料結構】判斷一棵樹是否為完全二叉樹

【資料結構】判斷一棵樹是否為完全二叉樹

完全二叉樹(Complete Binary Tree)

若設二叉樹的深度為h,除第h層外,其它各層(1~h-1)的結點數都達到最大個數,第h層所有的結點都連續集中在最左邊,這就是完全二叉樹。

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

一棵二叉樹至多隻有最下面的一層上的結點的度數可以小於2,並且最下層上的結點都集中在該層最左邊的若干位置上,則此二叉樹成為完全二叉樹。

判斷一棵樹是否為完全二叉樹,有以下幾種情況:

(1),倒數第二層不是滿二叉樹;

(2),最後一層從左往右不是連續的有節點;

(3),最後一層從左到右一次又節點。

使用佇列的方法來進行判斷一棵樹是否為完全二叉樹:

用程式碼實現:

#include<iostream>
using namespace std;
#include<queue>
struct TreeNode
{
	int _value;
	TreeNode* _left;
	TreeNode* _right;
};
bool IsCompleeTree(TreeNode* _root)
{
	if (_root == NULL)
	{
		return false;
	}
	queue<TreeNode*> q;
	q.push(_root);
	bool flag = false;//用來標誌是否為滿結點,也就是完全二叉樹
	while (!q.empty())//當佇列不為空的時候
	{
		TreeNode* cur = q.front();
		q.pop();
		if (flag)//flag==true,即已經出現過滿結點的時候
		{
			//cur結點的左子樹或者右子樹不為空,一定不是完全二叉樹
			if (cur->_left != NULL || cur->_right != NULL)
			{
				return false;
			}
		}
		//沒有出現過滿結點
		else
		{
			if (cur->_left != NULL&&cur->_right != NULL)
			{
				q.push(cur->_left);
				q.push(cur->_right);
			}
			//左子樹為空,右子樹不為空。一定不是完全二叉樹
			else if (cur->_left == NULL&&cur->_right != NULL)
			{
				return false;
			}
			//左子樹不為空,右子樹為空
			else if (cur->_left != NULL&&cur->_right == NULL)
			{
				q.push(cur->_left);
				flag = true;
			}
			//左子樹和右子樹都為空,則為完全二叉樹
			else
			{
				flag = true;
			}
		}
	}
	return true;
}



相關推薦

資料結構判斷是否完全

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

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

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

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

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

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

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

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

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

判斷是否完全

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

(先、中、後、層次遍歷,判斷同構和是否完全

二叉樹基本操作 二叉樹的結構定義 二叉樹的建立(遞迴) 訪問節點 先序遍歷 中序遍歷 後序遍歷 層次遍歷 判斷是否同構 判斷一顆二叉樹是否為完全二叉樹 二叉樹的結構定義

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

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

資料結構面試題/判斷是否是完全

二叉樹: 1.滿二叉樹:在一棵二叉樹中,如果所有分支節點都存在左子樹和右子樹,並且所有葉子節點都在同一層上。 2.完全二叉樹:如果一棵具有N個結點的二叉樹的結構與滿二叉樹的前N個結點的結構相同,稱為完全二叉樹。 //判斷一棵二叉樹是否是完全二叉樹--利

LeetCode筆記判斷是否映象

最初思路: 1.求樹的中序遍歷,存入vector; 2.判斷vector是否為為映象; /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNo

資料結構:由有序數列建立高度最小的排序判斷 個序列是否排序中的一個合法查詢序列

編寫一個程式,對於給定的一個有序的關鍵字序列,建立一棵高度最小的二叉排序樹。並判斷一個序列是否為該二叉排序樹中的一個合法的查詢序列 #include<stdio.h> #include<stdlib.h> typedef struct node

資料結構種排序演算法C++實現

   練習了十一種排序演算法的C++實現:以下依次為,冒泡、選擇、希爾、插入、二路歸併、快排、堆排序、計數排序、基數排序、桶排序,可建立sort.h和main.cpp將程式碼放入即可執行。如有錯誤,請指出更正,謝謝交流。 // sort.h # include <

——判斷是否是完全

alt 條件 height 所有結點 col 直接 都沒有 分享圖片 color 二叉樹按層遍歷 判斷條件:結點的左右孩子只有4種情況 其中的三種情況有特例 條件1.結點有右孩子,沒有左孩子,直接返回false 條件2.結點左右孩子不全(有左沒右,左右都沒有),則後面遇

1、如何判斷是否是完全

出現 層序 null bool ron 進行 while 代碼 新的 思路:通過樹的層序遍歷進行判斷。結點入隊時,當出現一個結點的孩子結點為空時,則之後就不能有新的結點入隊。 若沒有,則是完全二叉樹,否則不是完全二叉樹。 層序遍歷代碼: int after = 1;/

資料結構實驗-C語言-二叉樹的建立,前、中、後序遍歷的遞迴演算法和非遞迴演算法,求葉子結點數目,求二叉樹深度,判斷二叉樹是否相似,求二叉樹左右子互換,二叉樹層序遍歷的演算法,判斷二叉樹是否是完全二叉樹

1.實驗目的 熟練掌握二叉樹的二叉連結串列儲存結構的C語言實現。掌握二叉樹的基本操作-前序、中序、後序遍歷二叉樹的三種方法。瞭解非遞迴遍歷過程中“棧”的作用和狀態,而且能靈活運用遍歷演算法實現二叉樹的其它操作。 2.實驗內容 (1)二叉樹的二叉連結串列的建立 (2)二叉樹的前、中、後

劍指offer判斷是否平衡

平衡二叉樹(Balanced Binary Tree),具有以下性質:它是一棵空樹或它的左右兩個子樹的高度差的絕對值不超過1,並且左右兩個子樹都是一棵平衡二叉樹。 第一種遞迴思路,根據定義來,遞迴返回(r-l)<1 and balancetree(r) and bal

判斷是否是搜尋 判斷是否是完全

package class_04; import java.util.LinkedList; import java.util.Queue; /** * * 判斷一棵樹是否是搜尋二叉樹 * 判斷一棵樹是否是完全二叉樹 * */ public class Code

劍指Offer系列-面試題39-2:判斷是否平衡

題目:判斷一棵樹是否為平衡二叉樹 思路:根據上一題的二叉樹的深度,在遞迴過程中加上識別符號,遞迴到當前節點,判斷當前子樹是不是一個平衡二叉樹,如果不是,就把識別符號置為false,返回識別符號即可。

leetcode 110-判斷是否平衡

平衡二叉樹的定義: 空樹或者左右子樹的高度差不超過1且左右子樹也是平衡二叉樹。 需要用到計算深度的方法: public int depth(TreeNode root) { if (r

產生的映象,判斷是否對稱

程式碼均為Python: 1. 產生樹的映象: class Solution: def Mirror(self,root): if(root): roo