本題中,一棵高度平衡二叉樹定義為:
乙個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過1從頂至底(暴力法):
暴力法的思想就是求出左右子樹的高度,然後比較左子樹的高度和右子樹的高度是否符合題意,如果符合,再去判斷左子樹和右子樹是否為平衡二叉樹。此法複雜度較高,因為是從頂到底呼叫求高度函式,其實在求root節點高度時,整個樹的高度已經計算出來了但並未儲存,每次呼叫都會帶來求此節點為根的子樹的重複操作。
height函式用來求節點的高度。int height(treenode* root)isbalanced函式用來判斷以該節點為根的子樹是否為平衡二叉樹。
bool isbalanced(treenode* root)
時間複雜度為o(nlogn)。
從底至頂(提前阻斷):
思路 就是利用二叉樹的後序遍歷來做該題。
二叉樹的常用遍歷方法一共有四種:
前序遍歷:先訪問根節點,然後訪問左子樹,最後訪問右子樹。思考: 使用自底向上改用什麼遍歷來解決該問題。首先排除到前序遍歷和層序遍歷 因為它們都是自上而下進行訪問的。中序遍歷:先訪問左子樹,然後訪問根節點,最後訪問右子樹。
後序遍歷:先訪問左子樹,然後訪問右子樹,最後訪問根節點。
層序遍歷:從上到下,從左至右訪問某一層的節點。
再看中序遍歷,先左子樹,在根節點。 若此時訪問到根節點,無法知道右子樹的高度,無法解決此問題。所以採用後序遍歷。
思路:先通過遍歷左子樹到達最左端,在呼叫一次訪問空節點,此時返回高度0;再去遍歷該節點右子樹的根節點,通過後序遍歷可以得知該節點右子樹的高度,此時對高度進行判斷是否符合平衡二叉樹的要求,再更新該節點的高度即可。
第一版本:
bool balanced(treenode* root,int &height)
bool b1,b2;
int h1,h2;
b1 = balanced(root->left,h1);
b2 = balanced(root->right,h2);// 後序遍歷
height = max(h1,h2)+1;// 更新該節點高度
return b1 &&b2 &&abs(h1-h2) <2;
}bool isbalanced(treenode* root)
第二版本:
int balanced(treenode* root)
bool isbalanced(treenode* root)
判斷是否為平衡二叉樹
輸入一棵二叉樹,判斷該二叉樹是否是平衡二叉樹 定義 它是一棵空樹或它的左右兩個子樹的高度差的絕對值不超過1,並且左右兩個子樹都是一棵平衡二叉樹。舉例 判斷二叉樹是否為平衡二叉樹 例1 e a d b c 例2 e a b c 例3 e a d b c f g例1是平衡二叉樹,滿足平衡二叉樹的定義。e...
判斷是否為平衡二叉樹
題目描述 給定乙個二叉樹,判斷它是否是高度平衡的二叉樹。本題中,一棵高度平衡二叉樹定義為 乙個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過 1 示例 1 輸入 root 3,9,20,null,null,15,7 輸出 true 示例 2 輸入 root 1,2,2,3,3,null,nul...
判斷二叉樹是否為平衡二叉樹
一 線性思維 遍歷每個節點都時候,求左右子樹的深度,如果左右子樹深度相差不超過1,繼續遞迴遍歷左右節點,此種方法會重複遍歷,時間效率不高 is balanced t if t is null return true left treedepth t.left right treedepth t.ri...