题目描述
输入一棵二叉树,判断该二叉树是否是平衡二叉树。
思路
1.暴力法(会重复遍历多个节点,效率较低)
2.后序遍历(从叶向根,从下向上,每个节点只遍历一次)
遍历到一个节点之前,已经遍历了它的左右子树.在遍历每个节点的时候记录它的深度,一边遍历以便判断该节点是否平衡
注意:
函数声明的参数是引用类型(树的高度)然后直接传入树的高度变量,因为每次递归的过程中树的高度都再变大,需要真正改变实参的值
书中代码是声明函数参数为指针类型,然后传入的参数为地址传递
代码
class Solution {
public:
bool IsBalanced_Solution(TreeNode* pRoot) {
//记录递归过程中树的总高度
int depth = 0;
return isBalanced(pRoot, depth);
}
private:
bool isBalanced(TreeNode* pRoot, int& depth)
{
//遍历至叶节点
if(pRoot == nullptr)
{
depth = 0;
return true;
}
//声明变量记录左右子树高度
int left, right;
//若当前节点左右子树均为平衡二叉树
if(isBalanced(pRoot->left, left) && isBalanced(pRoot->right, right))
{
//定义变量记录左右子树高度差
int diff = left - right;
//计算左右子树高度差
if(diff >= -1 && diff <= 1)
{
//树的高度更新为左右子树高度较大的那个值再加1
depth = 1 + ((left > right) ? left : right);
return true;
}
}
return false;
}
};