題目描述:
給定乙個二叉樹,判斷它是否是高度平衡的二叉樹。
本題中,一棵高度平衡二叉樹定義為:乙個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過 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...