題目:程式設計題-平衡二叉樹
時間限制 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 層所有的結點都連續集中在最左邊,這就是完全...