平衡二叉树

题目

Alt

思路

自顶向下

我们知道一棵平衡二叉树定义为每个节点左右两个子树的高度差的绝对值不超过1,那么我们采用自顶向下的思路是:
** 从根节点开始,比较该节点是否满足平衡二叉树的条件,然后再比较左子树和右子树是否满足平衡二叉树的条件,这是两个子问题,所以可以递归调用**
相关代码如下:

class Solution {
public:
    bool isBalanced(TreeNode* root) {
		if (root == NULL)
			return true;
		if (abs(hightlength(root->left) - hightlength(root->right)) >1 )
			return false;
		return isBalanced(root->left) && isBalanced(root->right);
	}
	//求二叉树的高度,递归调用
	int hightlength(TreeNode* root) {
		if (root == NULL)
			return 0;
		if (!root->left && !root->right)
			return 1;
		return max(hightlength(root->left), hightlength(root->right)) + 1;
	}
};

采用自顶向下的一个缺点是:每次比较节点是否满足条件都需要计算左右子树的高度,造成了很大的冗余,所以我们可以采用自底向上的思路

自底向上

采用自底向上的思路是:我们先比较一个节点的左右子树是否满足平衡二叉树的条件,如果满足,那么我们再判断该节点是否满足条件
相关代码如下:

class Solution {
public:
    bool isBalancedTreeHelper(TreeNode* root, int& height) {
		if (root == NULL) {
			height = 0;
			return true;
		}
		int left, right;
		if (isBalancedTreeHelper(root->left, left) && isBalancedTreeHelper(root->right, right) && abs(left - right)<2) {
			height = max(left, right) + 1;
			return true;
		}
		return false;
	}
	bool isBalanced(TreeNode* root) {
		int height;
		return isBalancedTreeHelper(root, height);
	}
};

我们采用一个全局变量height来记录每个节点的高度,重点和难点在于是否理解自底向上的基本思路:

//首先递归的判断左右子树是否满足条件,然后再利用返回的左右子树高度来判断当前节点是否满足条件,若满足,则计算出该节点的高度,并返回true
int left, right;
if (isBalancedTreeHelper(root->left, left) && 							   isBalancedTreeHelper(root->right, right) && abs(left - right)<2) {
			height = max(left, right) + 1;
			return true;
		}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值