

题目
解决代码及点评
/*
求二叉树深度
*/
#include <iostream>
#include <stack>
using namespace std;
template<class T>
class BiTNode
{
public:
T nValue;
BiTNode<T> *pLChild;
BiTNode<T> *pRChild;
};
template<class T>
class BiTree
{
public:
BiTree();
~BiTree();
BiTNode<T> *Create();
BiTNode<T> *getRoot();
void InOrder(BiTNode<T> *p);
void PostOrder(BiTNode<T> *p);
void PreOrder(BiTNode<T> *p);
void Visit(BiTNode<T> *p);
int GetDeep(BiTNode<T> *p);
int GetMaxLengh();
private:
BiTNode<T> *pRoot;
int maxlengh;
};
template<class T>
BiTree<T>::BiTree()
{
pRoot = new BiTNode<T>;
}
template<class T>
BiTree<T>::~BiTree()
{
}
template<class T>
BiTNode<T> *BiTree<T>::Create()
{
T nValue;
BiTNode<T> *nRoot;
scanf_s("%d", &nValue);
if (nValue == 0)
{
nRoot = NULL;
}
else
{
nRoot = new BiTNode<T>;
if (NULL == nRoot)
{
printf("分配内存失败!\n");
}
else
{
nRoot->nValue = nValue;
printf("请输入%d结点的左子结点:", nRoot->nValue);
nRoot->pLChild = Create();
printf("请输入%d结点的右子结点:", nRoot->nValue);
nRoot->pRChild = Create();
}
}
pRoot=nRoot;
return nRoot;
}
template<class T>
void BiTree<T>::Visit(BiTNode<T> *p)
{
cout<< p->nValue;
}
template<class T>
BiTNode<T> *BiTree<T>::getRoot()
{
return pRoot;
}
template<class T>
void BiTree<T>::PreOrder(BiTNode<T> *pRoot)
{
if (pRoot==NULL)
{
return ;
}
else
{
Visit(pRoot);
PreOrder(pRoot->pLChild);
PreOrder(pRoot->pRChild);
}
}
template<class T>
void BiTree<T>::InOrder(BiTNode<T> *pRoot)
{
if (pRoot==NULL)
{
return ;
}
else
{
PreOrder(pRoot->pLChild);
Visit(pRoot);
PreOrder(pRoot->pRChild);
}
}
template<class T>
void BiTree<T>::PostOrder(BiTNode<T> *pRoot)
{
if (pRoot==NULL)
{
return ;
}
else
{
PreOrder(pRoot->pLChild);
PreOrder(pRoot->pRChild);
Visit(pRoot);
}
}
template<class T>
int BiTree<T>::GetMaxLengh() //每一个节点左右深度相加比较最大值
{
int maxlengh=0;
int deep=0;
int lengh=0;
if (pRoot==NULL)
{
return 0;
}
if (pRoot==NULL)
{
return 0;
}
else
{
lengh = GetDeep(pRoot->pLChild)+GetDeep(pRoot->pRChild)+2;
if (maxlengh<lengh)
{
maxlengh=lengh;
}
}
return maxlengh;
}
// 求树的深度, 这道题的关键是理解树的递归即可
template<class T>
int BiTree<T>::GetDeep(BiTNode<T> *pRoot)
{
int deep=0;
if (pRoot==NULL)
{
return 0;
}
if (pRoot==NULL)
{
return 0;
}
else // 树的深度就是左子树的深度 或者 由子树的深度,取大的再加1即可
{
if (GetDeep(pRoot->pLChild)>GetDeep(pRoot->pRChild))
{
deep=GetDeep(pRoot->pLChild)+1;
}
else deep=GetDeep(pRoot->pRChild)+1;
}
return deep;
}
int main()
{
printf("请输入根结点的值:");
BiTree<int> pRoot ;
pRoot.Create();
printf("前序遍历:");
pRoot.PreOrder(pRoot.getRoot());
cout<<endl;
printf("中序遍历:");
pRoot.InOrder(pRoot.getRoot());
cout<<endl;
printf("后序遍历:");
pRoot.PostOrder(pRoot.getRoot());
cout<<endl<<"深度"<<endl;
cout<<pRoot.GetDeep(pRoot.getRoot());
//cout<<endl<<"最长距离";
//cout<<pRoot.GetMaxLengh();
system("pause");
return 0;
}
代码下载及其运行
代码下载地址:http://download.youkuaiyun.com/detail/yincheng01/6704519
解压密码:c.itcast.cn
下载代码并解压后,用VC2013打开interview.sln,并设置对应的启动项目后,点击运行即可,具体步骤如下:
1)设置启动项目:右键点击解决方案,在弹出菜单中选择“设置启动项目”
2)在下拉框中选择相应项目,项目名和博客编号一致
3)点击“本地Windows调试器”运行
程序运行结果