求二叉树的深度和宽度
// 求二叉树的深度和宽度.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
#include <iostream>
#include <queue>
using namespace std;
struct BTNode
{
char m_value;
BTNode *m_left;
BTNode *m_right;
};
//先序创建二叉树
void CreatBTree(BTNode *&root)
{
char nValue = 0;
cin >> nValue;
if ('#' == nValue)
{
return;
}
else
{
root = new BTNode();
root->m_value = nValue;
CreatBTree(root->m_left);
CreatBTree(root->m_right);
}
}
//求二叉树的深度
int GetDepth(BTNode *pRoot)
{
if (pRoot == NULL)
{
return 0;
}
// int nLeftLength = GetDepth(pRoot->m_left);
// int nRigthLength = GetDepth(pRoot->m_right);
// return nLeftLength > nRigthLength ? (nLeftLength + 1) : (nRigthLength + 1);
return GetDepth(pRoot->m_left) > GetDepth(pRoot->m_right) ?
(GetDepth(pRoot->m_left) + 1) : (GetDepth(pRoot->m_right) + 1);
}
//求二叉树的宽度
int GetWidth(BTNode *pRoot)
{
if (pRoot == NULL)
{
return 0;
}
int nLastLevelWidth = 0;//记录上一层的宽度
int nTempLastLevelWidth = 0;
int nCurLevelWidth = 0;//记录当前层的宽度
int nWidth = 0;//二叉树的宽度
queue<BTNode *> myQueue;
myQueue.push(pRoot);//将根节点入队列
nLastLevelWidth = 1;
BTNode *pCur = NULL;
while (!myQueue.empty())//队列不空
{
nTempLastLevelWidth = nLastLevelWidth;
while (nTempLastLevelWidth != 0)
{
pCur = myQueue.front();//取出队列头元素
myQueue.pop();//将队列头元素出对
if (pCur->m_left != NULL)
{
myQueue.push(pCur->m_left);
}
if (pCur->m_right != NULL)
{
myQueue.push(pCur->m_right);
}
nTempLastLevelWidth--;
}
nCurLevelWidth = myQueue.size();
nWidth = nCurLevelWidth > nLastLevelWidth ? nCurLevelWidth : nLastLevelWidth;
nLastLevelWidth = nCurLevelWidth;
}
return nWidth;
}
int _tmain(int argc, _TCHAR* argv[])
{
BTNode *pRoot = NULL;
CreatBTree(pRoot);
cout << "二叉树的深度为:" << GetDepth(pRoot) << endl;
cout << "二叉树的宽度为:" << GetWidth(pRoot) << endl;
system("pause");
return 0;
}
运行结果: