判断二叉平衡树的三种方法

题目

实现一个函数,检查二叉树是否平衡。在这个问题中,平衡树的定义如下,任意一个节点,其两颗子树的高度差不超过1。

分析

判断平衡二叉树是一个常见题目,一般来说,我们都是求出左右子树的高度,根据定义判断其差。下面给出三种实现方法,大家可以对比其优劣。

代码

/*
题目描述

实现一个函数,检查二叉树是否平衡,平衡的定义如下,对于树中的任意一个结点,
其两颗子树的高度差不超过1。
给定指向树根结点的指针TreeNode* root,请返回一个bool,代表这棵树是否平衡。
*/

#include <iostream>
#include <cstdlib>
#include <algorithm>

using namespace std;


struct TreeNode {
	int val;
	struct TreeNode *left;
	struct TreeNode *right;
	TreeNode(int x) :
		val(x), left(NULL), right(NULL) {
	}
};

class Balance {
public:
	
	/*方法一: T(n)=O(nlogn)*/
	bool isBalance(TreeNode* root) {
		// write code here
		if (!root)
			return true;
		else if (abs(height(root->left) - height(root->right)) > 1)
			return false;
		else
			return isBalance(root->left) && isBalance(root->right);

	}
	//求二叉树高度
	int height(TreeNode *root)
	{
		if (!root)
			return 0;
		else
		{
			return max(height(root->left), height(root->right)) + 1;
		}//ekse
	}

	/*方法二:改进过的算法,空间复杂度为O(H) 时间复杂度为O(N)*/
	bool isBalance2(TreeNode *root)
	{
		if (checkHeight(root) == -1)
			return false;
		else
			return true;
	}

	/*检测二叉树是否平衡,若不平衡返回-1,若平衡返回当前树的高度*/
	int checkHeight(TreeNode *root)
	{
		/*返回空树的高度为0*/
		if (root == NULL)
			return 0;

		/*检查左子树是否平衡*/
		int leftHeight = checkHeight(root->left);
		/*若返回-1,说明左子树为非平衡树*/
		if (leftHeight == -1)
			return -1;

		int rightHeight = checkHeight(root->right);
		if (rightHeight == -1)
			return -1;

		/*检查当前节点是否平衡*/
		int heightDiff = abs(leftHeight - rightHeight);
		if (heightDiff > 1)
			return -1;
		else{
			/*返回高度*/
			return max(leftHeight, rightHeight) + 1;
		}
	}


	/*方法三:优化算法T(n)=O(n) S(n)=O(logn)*/
	bool isBalance3(TreeNode *root, int &height)
	{
		if (root == NULL)
		{
			height = 0;
			return true;
		}

		int leftHeight = 0, rightHeight = 0;
		bool leftRet = isBalance3(root->left, leftHeight);
		bool rightRet = isBalance3(root->right, rightHeight);

		height = max(leftHeight, rightHeight) + 1;
		if (abs(leftHeight - rightHeight) > 1)
			return false;
		return leftRet && rightRet;
	}
};

    原文作者:平衡二叉树
    原文地址: https://blog.csdn.net/fly_yr/article/details/52172014
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞