题目来自剑指Offer
题目:
思路:
类似后序遍历,同时要判断左右子树是否为平衡二叉树。
代码:
#include <iostream>
#include <assert.h>
using namespace std;
const int SIZE = 100;
struct BinaryTreeNode
{
char m_nValue;
BinaryTreeNode* m_pLeft;
BinaryTreeNode* m_pRight;
};
bool IsBalance(BinaryTreeNode* pRoot,int& nDepth)
{
if (!pRoot)
{
nDepth = 0;
return true;
}
int nLeftDepth = -1;
int nRightDepth = -1;
int nDiff = -1;
if (IsBalance(pRoot->m_pLeft,nLeftDepth) && IsBalance(pRoot->m_pRight,nRightDepth))
{
nDiff = nLeftDepth - nRightDepth;
if (nDiff >= -1 && nDiff <= 1)
{
nDepth = max(nLeftDepth,nRightDepth) + 1;
return true;
}
}
return false;
}
bool IsBalance(BinaryTreeNode* pRoot)
{
if (pRoot == NULL)
{
cout<<"空树!"<<endl;
return false;
}
int nDepth = 0;
return IsBalance(pRoot,nDepth);
}
void Create(BinaryTreeNode*& pRoot)
{
char newData;
cin >> newData;
if ('#' == newData)
{
pRoot = NULL;
}
else
{
pRoot = new BinaryTreeNode;
pRoot->m_nValue = newData;
Create(pRoot->m_pLeft);
Create(pRoot->m_pRight);
}
}
int main()
{
BinaryTreeNode* pRoot = NULL;
Create(pRoot);
if (IsBalance(pRoot))
{
cout<<"平衡二叉树!"<<endl;
}
else
{
cout<<"不是平衡二叉树!"<<endl;
}
system("pause");
return 1;
}
注意:
树的构建类似树的子结构,这里不再详述。