判斷一棵樹是否是平衡二叉樹

2021-06-21 13:57:19 字數 2211 閱讀 3409

題目:程式設計題-平衡二叉樹

時間限制 1000 ms,記憶體限制 256000 kb,**長度限制 8000 b

判斷乙個二叉樹是不是平衡

說明:一棵二叉樹任意乙個節點的左右子樹的深度差不大於1,即為平衡二叉樹。

給定乙個有n個節點的二叉樹,每個節點有乙個序號表示,樹有m條分支。每個分支用三個數字a b c表示,指a節點的左兒子為b,右兒子為c。如果b或c為-1,說明無該兒子。

規定樹根的序號為1,樹的節點數目最多不超過50000。

每個測試資料有多組case。

對於每個case,第一行先輸入n和m。然後下面m行每行代表乙個分支。

對於每個case輸出為一行,如果該樹是平衡二叉樹,請輸出1,否則輸出0

每個case之間不需要空行隔開,如以下示例

輸入示例

11 5

5 6 7

4 10 11

3 8 9

1 2 3

2 4 5

13 6

6 7 8

2 3 4

10 11 12

8 9 10

1 2 13

4 5 6

輸出示例1

0

分析:題目可以分解成兩個問題:

1、根據輸入資料組織二叉樹;

2、判斷平衡二叉樹。

針對問題1:由於每個結點序號已事先固定,可以使用陣列來表示,陣列下標即為結點序號。對於每個結點的左右孩子的表示,可以定義兩個陣列,分別是leftchild左孩子陣列,rightchild右孩子陣列,結點i的左孩子為leftchild[i],右孩子為rightchild[i];也可以定義乙個結構體 struct node ,再定義結點陣列bitree,如此結點i的左右孩子即為bitree[i].leftchild, bitree[i].rightchild。

[cpp]view plain

copy

#include 

#include 

struct

node   

};  

方法一:判斷二叉樹是否平衡與求取每個結點的深度分離,此方法簡單直觀,但效率不高,每個結點在判斷平衡和求取深度的時候都被重複遍歷

[cpp]view plain

copy

intdepthofbitree(node bitree, 

inti)   

bool

isbalancebitree(node bitree, 

inti)   

方法二:判斷二叉樹是否平衡和求取結點深度統一,此時避免了上面的問題

[cpp]view plain

copy

bool

isbalancebitree(node bitree, 

inti, 

int*depth)   

intleftdepth, rightdepth;  

if(isbalancebitree(bitree, bitree[i].leftchild, &leftdepth)  

&& isbalancebitree(bitree, bitree[i].rightchild, &rightdepth))   

}  return

false

;  }  

bool

isbalancebitree(node bitree)   

讀取資料的函式,以(0,0)結束:

[cpp]view plain

copy

void

readdata()   

if(isbalancebitree(bitree))  

result.push(true

);  

else

result.push(false

);  

delete

bitree;  

bitree = null;  

}  while

(!result.empty())   

}  

ps:有道,機試,2013,校招

二叉樹 判斷一棵樹是否是平衡二叉樹

平衡二叉樹 空樹或者左右兩個孩子高度差不超過1 在涉及到二叉樹的題目時,遞迴函式非常好用 列出可能性 整理出返回值的型別 整個遞迴過程按照同樣的結構得到子樹的資訊,整合子樹的資訊,加工出應該返回的資訊,向上返回 1.左子樹是否平衡 2.右子樹是否平衡 3.左子樹的高度 4.右子樹的高度 根據可能性,...

如何判斷一棵樹是否是平衡二叉樹

判斷的思路很簡單,若一棵樹是平衡二叉樹,它的左右子樹都是平衡二叉樹,並且左右子樹的高度差小於等於1。注意,實現的時候,判斷左右子樹的平衡性時,可以順便計算子樹高度,不用再另外計算一次,下面是其遞迴實現 include using namespace std struct treenode class...

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

1 基礎知識 二叉樹 二叉樹是一棵特殊的樹,二叉樹每個節點最多有兩個孩子結點,分別稱為左孩子和右孩子。滿二叉樹 高度為n的滿二叉樹有2 n 1個節點的二叉樹。完全二叉樹 若設二叉樹的深度為h,除第h 層外,其它各層 1 h 1 的結點數都達到最大個數,第h 層所有的結點都連續集中在最左邊,這就是完全...