判断一棵二叉树是否是平衡二叉树
任意给定一棵二叉树,判断它是否是平衡二叉树。所谓平衡二叉树,是指二叉树中任意一个结点的左右子树的高度之差不超过1
可以分两步实现。第一步先实现求解 二叉树中每个结点的高度的函数height(BinaryNode );然后先序遍历二叉树中的每一个结点node,调用height()求出该结点的左子树高度height(node.left) 和 右子树高度 height(node.right)。根据左右子树的高度判断是否为平衡二叉树。
int HeightOfBinatyTree(BinaryTreeNode* pRoot) //求二叉树的高度
{
if (pRoot == NULL)
return 0;
int m = HeightOfBinatyTree(pRoot->_pLeft);
int n = HeightOfBinatyTree(pRoot->_pRight);
return (m>n)? (m+1):(n+1);
}
bool IsBalanceTree(BinaryTreeNode* pRoot) //判断二叉树是否是平衡二叉树
{
if (!pRoot)
return true;
int left_height = HeightOfBinatyTree(pRoot->_pLeft);
int right_height = HeightOfBinatyTree(pRoot->_pRight);
if(abs(left_height - right_height) > 1)
return false;
else
return IsBalanceTree(pRoot->_pLeft) && IsBalanceTree(pRoot->_pRight);
}
求二叉树的镜像
void MirrorTree(BinaryTreeNode* pRoot)
{
if(pRoot == NULL)
return ;
if(pRoot->_pLeft == NULL && pRoot->_pRight == NULL) //该结点是叶子结点
return ;
BinaryTreeNode *pTemp = pRoot->_pLeft; //交换左右孩子
pRoot->_pLeft = pRoot->_pRight;
pRoot->_pRight = pTemp;
if (pRoot->_pLeft)
MirrorTree(pRoot->_pLeft);
if (pRoot->_pRight)
MirrorTree(pRoot->_pRight);
}