剑指offer:平衡二叉树

题目描述:输入一棵二叉树,判断该二叉树是否是平衡二叉树。

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

解题思路:对于一个树,判断它是不是平衡二叉树,那就看看它左子树是不是一棵平衡二叉树,右子树是不是一棵平衡二叉树,根节点平不平衡。在判断每个节点平不平衡的时候,就是看它的左子树高度和右子树高度绝对值之差。同时这个题可以剪枝,若左子树不是,那直接返回false,右子树不是,也直接返回false。

完整的可测试运行的程序

#include
#include
using namespace std;
struct TreeNode {
	int val;
	struct TreeNode* left;
	struct TreeNode* right;
	TreeNode(int x) :
		val(x), left(NULL), right(NULL) {
	}
};

int getlevel(TreeNode* T)
{
	if (T == NULL)
	{
		return 0;
	}
	int LD = getlevel(T->left);
	int RD = getlevel(T->right);
	return LD > RD ? LD + 1 : RD + 1;
	
}


bool judgeBalance(TreeNode* T)
{
	if (T == NULL)
	{
		return true;
	}
	int LD = getlevel(T->left);
	int RD = getlevel(T->right);
	if (abs(LD - RD) >= 2)
	{
		return false;
	}
	else
	{
		return true;
	}
}

bool IsBalanced_Solution(TreeNode* pRoot) 
{
	if (pRoot != NULL)
	{
		bool Lside = IsBalanced_Solution(pRoot->left);
		if (Lside == false)
		{
			return false;
		}
		bool Rside = IsBalanced_Solution(pRoot->right);
		if (Rside == false)
		{
			return false;
		}
		bool side = judgeBalance(pRoot);
		return side;
	}
	else
	{
		return true;
	}
}

TreeNode* creat()
{
	int tmp;
	//TreeNode* T = NULL;
	cin >> tmp;
	if (tmp != 0)
	{
		TreeNode* T = new TreeNode(tmp);
		T->left = creat();
		T->right = creat();
		return T;
	}
	else
	{
		return NULL;
	}
}

int main()
{
	TreeNode* T = creat();
	if (IsBalanced_Solution(T))
	{
		cout << "true";
	}
	else
	{
		cout << "false";
	}
}

你可能感兴趣的:(剑指offer,C++)