判斷是否為平衡二叉樹

2021-10-08 04:21:33 字數 1309 閱讀 4264

本題中,一棵高度平衡二叉樹定義為:

乙個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過1

從頂至底(暴力法):

暴力法的思想就是求出左右子樹的高度,然後比較左子樹的高度和右子樹的高度是否符合題意,如果符合,再去判斷左子樹和右子樹是否為平衡二叉樹。此法複雜度較高,因為是從頂到底呼叫求高度函式,其實在求root節點高度時,整個樹的高度已經計算出來了但並未儲存,每次呼叫都會帶來求此節點為根的子樹的重複操作。

height函式用來求節點的高度。

isbalanced函式用來判斷以該節點為根的子樹是否為平衡二叉樹。

int height(treenode* root)

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...