/***************************************************************
题目一:输入一颗二叉树的根节点,求该数的深度。从根节点到叶节点依次
经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。
***************************************************************/
/*
解题思路:
树的深度等于(左右子树深度较大值+1),如果没有左右子树,则左右子树
深度设置为0;
*/
#include<stdio.h>
struct BinaryTreeNode
{
int m_nValue;
BinaryTreeNode* m_pLeft;
BinaryTreeNode* m_pRight;
};
int treeDepath(BinaryTreeNode* pRoot)
{
if(pRoot == NULL)
return 0;
int nLeft = treeDepath(pRoot->m_pLeft);
int nRight = treeDepath(pRoot->m_pRight);
return(nLeft>nRight ? nLeft+1 : nRight+1);
}
BinaryTreeNode* createTreeNode(int value)
{
BinaryTreeNode* pNode = new BinaryTreeNode();
pNode->m_nValue = value;
pNode->m_pLeft = NULL;
pNode->m_pRight = NULL;
return pNode;
}
void connect(BinaryTreeNode* pParent, BinaryTreeNode* pLeftChild,
BinaryTreeNode* pRightChild)
{
if(pParent == NULL)
return;
pParent->m_pLeft = pLeftChild;
pParent->m_pRight = pRightChild;
}
void test()
{
BinaryTreeNode* pNode1 = createTreeNode(1);
BinaryTreeNode* pNode2 = createTreeNode(2);
BinaryTreeNode* pNode3 = createTreeNode(3);
BinaryTreeNode* pNode4 = createTreeNode(4);
BinaryTreeNode* pNode5 = createTreeNode(5);
BinaryTreeNode* pNode6 = createTreeNode(6);
BinaryTreeNode* pNode7 = createTreeNode(7);
connect(pNode1,pNode2,pNode3);
connect(pNode2,pNode4,pNode5);
connect(pNode5,pNode7,NULL);
connect(pNode3,NULL,pNode6);
int depath = treeDepath(pNode1);
printf("%d\t",depath);
}
int main()
{
test();
return 0;
}
/***************************************************************
题目二:输入一颗二叉树的根节点,判断该树是不是平衡二叉树。如果
某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一颗平衡
二叉树。
***************************************************************/
/*
解题思路:
如果用前面提到的获取二叉树深度方法来遍历二叉树左右节点,以确定该二叉树
是否为平衡二叉树,这样会重复遍历一个节点多次。效率不高。
但如果我们用后序遍历的方式遍历二叉树的每一个节点,在遍历到一个节点之前
我们已经遍历了它的左右子树。只要在遍历每个节点的时候记录它的深度,我们
就可以一边遍历一边判断每个节点是不是平衡的。
*/
#include<stdio.h>
struct BinaryTreeNode
{
int m_nValue;
BinaryTreeNode* m_pLeft;
BinaryTreeNode* m_pRight;
};
bool isBalanced(BinaryTreeNode* pRoot, int* pDepth)
{
if(pRoot == NULL)
{
*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 = (left > right ? left : right) + 1;
return true;
}
}
return false;
}
BinaryTreeNode* createTreeNode(int value)
{
BinaryTreeNode* pNode = new BinaryTreeNode();
pNode->m_nValue = value;
pNode->m_pLeft = NULL;
pNode->m_pRight = NULL;
return pNode;
}
void connect(BinaryTreeNode* pParent, BinaryTreeNode* pLeftChild,
BinaryTreeNode* pRightChild)
{
if(pParent == NULL)
return;
pParent->m_pLeft = pLeftChild;
pParent->m_pRight = pRightChild;
}
void test()
{
BinaryTreeNode* pNode1 = createTreeNode(1);
BinaryTreeNode* pNode2 = createTreeNode(2);
BinaryTreeNode* pNode3 = createTreeNode(3);
BinaryTreeNode* pNode4 = createTreeNode(4);
BinaryTreeNode* pNode5 = createTreeNode(5);
BinaryTreeNode* pNode6 = createTreeNode(6);
BinaryTreeNode* pNode7 = createTreeNode(7);
connect(pNode1,pNode2,pNode3);
connect(pNode2,pNode4,pNode5);
connect(pNode5,pNode7,NULL);
connect(pNode3,NULL,pNode6);
int depath;
if(isBalanced(pNode1,&depath)){
printf("Yes");
}
}
int main()
{
test();
return 0;
}
==参考剑指offer