判斷是否為平衡二叉樹

2022-06-11 12:18:11 字數 1844 閱讀 7865

題目描述:

給定乙個二叉樹,判斷它是否是高度平衡的二叉樹。

本題中,一棵高度平衡二叉樹定義為:乙個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過 1 。

示例 1:

輸入:root = [3,9,20,null,null,15,7]

輸出:true

示例 2:

輸入:root = [1,2,2,3,3,null,null,4,4]

輸出:false

示例 3:

輸入:root =

輸出:true

遞迴三步曲分析:

明確遞迴函式的引數和返回值

引數為傳入的節點指標,返回要傳入節點為根節點樹的深度。

如果當前傳入節點為根節點的二叉樹已經不是二叉平衡樹了,還返回高度的話就沒有意義了。

所以如果已經不是二叉平衡樹了,可以返回-1 來標記已經不符合平衡樹的規則了。

// -1 表示已經不是平衡二叉樹了,否則返回值是以該節點為根節點樹的高度

int getdepth(treenode* node)

明確終止條件

遞迴的過程中依然是遇到空節點了為終止,返回0,表示當前節點為根節點的高度為0

if (node == null)
明確單層遞迴的邏輯

如何判斷當前傳入節點為根節點的二叉樹是否是平衡二叉樹呢,分別求出左右子樹的高度,然後如果差值小於等於1,則返回當前二叉樹的高度,否則則返回-1,表示已經不是二叉樹了。

int leftdepth = depth(node->left); // 左

if (leftdepth == -1) return -1;

int rightdepth = depth(node->right); // 右

if (rightdepth == -1) return -1;

int result;

if (abs(leftdepth - rightdepth) > 1) else

return result;

完整**:

/**

* definition for a binary tree node.

* struct treenode

* treenode(int x) : val(x), left(nullptr), right(nullptr) {}

* treenode(int x, treenode *left, treenode *right) : val(x), left(left), right(right) {}

* };

*/class solution

int lefthigh = gethigh(node->left);

if(lefthigh == -1)

return -1;

int righthigh = gethigh(node->right);

if(righthigh == -1)

return -1;

return abs(lefthigh - righthigh) > 1 ? -1 : max(lefthigh, righthigh) + 1;

}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,繼續遞迴遍歷左右節點,此種方法會重複遍歷,時間效率不高 is balanced t if t is null return true left treedepth t.left right treedepth t.ri...