求二叉樹高度 leetcode110 平衡二叉樹

2021-10-12 09:18:39 字數 2217 閱讀 2919

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

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

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

示例 1:

給定二叉樹[3,9,20,null,null,15,7]

3

/ 9 20

/ 15 7

返回true

示例 2:

給定二叉樹[1,2,2,3,3,null,null,4,4]

1

/ 2 2

/ 3 3

/ 4 4

返回false

首先要考慮平衡二叉樹的概念,即每個節點的左右子樹高度相差不超過1,且每個子樹本身也為平衡二叉樹。

這種子樹也為xx的題目,我們很容易想到遞迴。

需要計算高度和子樹是不是平衡二叉樹,所以我們可以再定義乙個函式height(root),來返回root對應的樹的高度。那麼我們可以對結點直接對根節點進行操作,返回

abs(height(root->left) - height(root->right)) <= 1 && isbalanced(root->left) && isbalanced(root->right)
可以注意到,上面的意思即為,左右子樹的高度差小於等於1,且左右子樹都是平衡二叉樹。

但是這個方法複雜度較高,因為先求了root.left和root.right的高度,求它們高度的時候就需要遞迴到最底層,而在計算isbalanced(root.left)以及isbalanced(root.right)的時候,還會呼叫height來計算下一層的結點的高度,也會遞迴到最底層,這就造成了重複計算。

因此我們使用後序遍歷的方法來進行優化,先計算最底層的高度,是否平衡,然後一點一點向上。我們將height函式進行改造,如果root子樹不是平衡二叉樹,那麼我們返回-1,否則返回高度:

由上面的height結構,我們呼叫height(root),後序遍歷它會從最低層開始計算高度,且不會重複計算,因此減少了許多重複計算。對於height(root),如果結果不等於-1,那麼即為平衡二叉樹,返回true。

# definition for a binary tree node.

# class treenode:

# def __init__(self, x):

# self.val = x

# self.left = none

# self.right = none

class solution:

def isbalanced(self, root: treenode) -> bool:

# 返回子樹的高度,如果不是平衡二叉樹,返回-1

def height(root):

if not root:

return 0

# 後序遍歷,先計算左右子樹

left = height(root.left)

right = height(root.right)

if left == -1 or right == -1 or abs(left-right) > 1:

return -1

else:

return max(left,right) + 1

return height(root) != -1

/**

* definition for a binary tree node.

* struct treenode

* };

*/class solution

// 返回子樹的高度,如果不是平衡二叉樹則返回-1

Leetcode 1 二叉樹篇

二叉樹題目的遞迴解法可以分兩類思路 第一類是遍歷一遍二叉樹得出答案 回溯演算法核心框架 第二類是通過分解問題計算出答案 動態規劃核心框架 遇到一道二叉樹的題目時的通用思考過程是 是否可以通過遍歷一遍二叉樹得到答案?如果不能的話,是否可以定義乙個遞迴函式,通過子問題 子樹 的答案推導出原問題的答案?二...

求二叉樹高度

函式介面定義 int getheight bintree bt 其中bintree結構定義如下 typedef struct tnode position typedef position bintree struct tnode 要求函式返回給定二叉樹bt的高度值。裁判測試程式樣例 include...

求二叉樹高度

本題要求給定二叉樹的高度。函式介面定義 int getheight bintree bt 其中bintree結構定義如下 typedef struct tnode position typedef position bintree struct tnode 要求函式返回給定二叉樹bt的高度值。裁判測...