题目:输入一颗二叉树的根结点 求该树的深度 从根结点到叶节点一次经过的节点(含根、叶结点)形成树的一条路径 最长路径为树的深度
二叉树的节点定义如下:
typedef struct BinaryTreeNode
{
int m_nValue;
BinaryTreeNode* m_pLeft;
BinaryTreeNode* m_pRight;
};
int max(int a, int b)
{
return a > b ? a : b;
}
</pre><pre name="code" class="cpp">
int high(BinaryTreeNode* r )
{
if (r == NULL)
return 0;
return max(high(r->m_pLeft), high(r->m_pRight)) + 1;
}
题目:输入一颗二叉树的根节点 判断该树是不是平衡二叉树 如果某二叉树中任意结点的左右子树的深度相差不超过1 那么它就是一颗平衡二叉树
bool Isbalance(BinaryTreeNode *r)
{//遍历二叉树的同时检测二叉树是否是平衡二叉树
if (r == NULL)
return true;
int left = high(r->m_pLeft);
int right = high(r->m_pRight);
if (abs(right - left) > 1)
return false;
return Isbalance(r->m_pLeft) && Isbalance(r->m_pRight);
}
如果用后序遍历的方式遍历二叉树的每一个结点 在遍历到一个结点之前 就已经遍历了它的左右子树 只要在遍历每个结点时记录它的深度 就可以一边遍历一遍判断每个结点是不是平衡的
bool Isbalances(BinaryTreeNode *r,int *deep)
{
if (r == NULL)
{
*deep = 0;
return true;
}
int left = 0;
int right = 0;
if (Isbalances(r->m_pLeft, &left) && Isbalances(r->m_pRight, &right))
{
*deep = max(left, right) + 1;
return true;
}
return false;
}
bool IsBalanceTree(BinaryTreeNode *root)
{
int t = 0;
return Isbalances(root, &t);
}