题目
输入一棵二叉树的根结点,求该树的深度。
思路
如果一棵树只有一个结点,它的深度为1。如果根结点只有左子树,那么树的深度应该是该其左子树的深度加1;同样如果根结点只有右子树而没有左子树,那么树的深度是其右子树的深度加1。如果既有右子树又有左子树,那该树的深度就是其左、右子树的深度较大值再加1。
题目
输入一棵二叉树的根结点,判断该树是不是平衡二叉树。
思路
在遍历树的每个结点的时候,先得到它的左右子树的深度。如果每个结点的左右子树的深度相差都不超过1,按照定义它就是一棵平衡的二叉树。遍历时,采用后序遍历的方式可以减少重复判断左右子树的次数。
代码
#include <iostream>
using namespace std;
struct BinaryTreeNode
{
int m_nValue;
BinaryTreeNode* m_pLeft;
BinaryTreeNode* m_pRight;
};
int TreeDepth(BinaryTreeNode* pRoot)
{
if (pRoot == nullptr)
return 0;
int nLeft = TreeDepth(pRoot->m_pLeft);
int nRight = TreeDepth(pRoot->m_pRight);
return (nLeft > nRight) ? (nLeft + 1) : (nRight + 1);
}
bool IsBalanced(BinaryTreeNode* pRoot, int* pDepth)
{
if (pRoot == nullptr)
{
*pDepth = 0;
return true;
}
int left, right;
if (IsBalanced(pRoot->m_pLeft, &left)
&& IsBalanced(pRoot->m_pRight, &right))
{
int diff = left - right;
if (diff <= 1 && diff >= -1)
{
*pDepth = 1 + (left > right ? left : right);
return true;
}
}
return false;
}
int main()
{
BinaryTreeNode n8{8, nullptr, nullptr};
BinaryTreeNode n7{7, nullptr, nullptr};
BinaryTreeNode n6{6, nullptr, nullptr};
BinaryTreeNode n5{5, nullptr, nullptr};
BinaryTreeNode n4{4, &n8, nullptr};
BinaryTreeNode n3{3, &n6, &n7};
BinaryTreeNode n2{2, &n4, &n5};
BinaryTreeNode n1{1, &n2, &n3};
int depth = 0;
cout << "The depth is: " << TreeDepth(&n1) << endl
<< "Is a Balance Tree ? : " << IsBalanced(&n1, &depth) << endl;
return 0;
}