【資料結構】判斷一棵樹是否為完全二叉樹
完全二叉樹(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