上一周回家了一趟,家裡很忙,一段時間都沒有貢獻了。對於平衡二叉樹的判斷,貌似劍指offer裡面也有,對樹的深度用遞迴的思想,為左右子樹加1即可,方法一一般思路,方法二用引用返回樹的高度不容易。
//題目描述
////
實現乙個函式,檢查二叉樹是否平衡,平衡的定義如下,對於樹中的任意乙個結點,其兩顆子樹的高度差不超過1。
//給定指向樹根結點的指標treenode* root,請返回乙個bool,代表這棵樹是否平衡。
//題目分析:
//《方法1>:
//平衡二叉樹是通過左右子樹的高度來判斷是否為平衡二叉樹的,所以我們首先想到的是如何求乙個樹的高度,求乙個樹的高度很簡單,遞迴求解,每次求出左右子樹的最大高度再加1便是父節點的高度,這樣遞迴下去,便可以求出任何一顆樹的高度。
//既然可以求出任何乙個節點的高度,那麼通過再次遍歷二叉樹,判斷任何乙個節點的左右子樹高度相差是否滿足平衡二叉樹便可實現平衡二叉樹的判斷。
//求一顆平衡樹高度的時間複雜度為o(logn),那麼在第二次遍歷的時候需要求每個節點的高度時間複雜度為o(nlogn)。其實這個過程大部分都是重複判斷的,下面的方法是該方法的濃縮。
//《方法2>:
//在一次遍歷的過程中,既求乙個節點的高度,同時該節點是否滿足平衡條件,遞迴函式中乙個引用引數返回子節點的高度,然後父節點的高度便可以通過兩個子節點的高度求出來,首先判斷兩個子節點的高度是否滿足平衡二叉樹,不滿足直接返回,滿足的情況下,求出當前節點的高度,繼續向上遞迴。
//該方法的時間複雜度只有o(logn)
struct
treenode
};//
方法一:
class
balance
//int deep = 0;
int left = treedeep(root->left);
int right = treedeep(root->right);
return left > right ? (left + 1) : (right + 1
); }
bool isbalance(treenode *root)
/*if (root->left!=nullptr)
*/int left = treedeep(root->left);
int right = treedeep(root->right);
if (left-right>1||left-right<-1
)
return isbalance(root->left) && isbalance(root->right);
}};//
方法二class
balance
bool isbalance1(treenode* root, int &high)
intlhigh, rhigh;
if (!isbalance1(root->left, lhigh) || !isbalance1(root->right, rhigh))
return
false
;
if (lhigh - rhigh>1 || lhigh - rhigh<-1
)
return
false
; high = (lhigh >= rhigh ? lhigh : rhigh) + 1
;
return
true
; }
};
判斷平衡二叉樹
演算法 樹 平衡二叉樹 平衡二叉樹的概念 左右節點的樹高之差小於1。1.計算節點的高。通過遞迴,求出左右子樹的高度,當前節點的高度,最大的那乙個 1。int getheight treenode root 2.通過遞迴的方法計算左子樹和右子樹的樹高之差是否有小於1的,有就直接返回false.publ...
判斷平衡二叉樹
package com.jsp.tree 判斷是否是平衡二叉樹 author jiangshipan 任何乙個節點 左子樹和右子數高度差小於1 以每乙個節點為頭的樹都是平衡的,則這個樹平衡 可能 1.左樹不平 2.右樹不平 3.左或右高 整棵樹 public class isbalancedtree...
判斷平衡二叉樹
輸入一棵二叉樹,判斷該二叉樹是否是平衡二叉樹。最直接的做法,遍歷每個節點,借助乙個獲取樹深度的遞迴函式,根據該節點的左右子樹高度差判斷是否平衡,然後遞迴地對左右子樹進行判斷 pubic class solution private intmaxdepth treenode root 這種做法有很明顯...