二叉树的深度和宽度

二叉树的深度:从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。

二叉树的宽度:二叉树的每一层中都有一定数量的节点,节点数最多的那一层的节点数叫做二叉树的宽度。

假设二叉树的节点有如下数据结构

typedef struct BinaryNode
{
	char data;
	struct BinaryNode *lchild;
	struct BinaryNode *rchild;
}BinaryNode,*BinaryTree;

1)求二叉树的深度

根据刚才对二叉树深度的说明,我们会很容易想到递归的方法。很显然只有一个节点的二叉树的深度是1,没有节点的二叉树的深度是0.假设一棵二叉树带有两个孩子节点,那么我可以说这棵二叉树的深度等于根节点的左右孩子节点的深度的最大值再加上1. 

2)求二叉树的宽度

我们可以把二叉树中每层的节点依次放入一个队列中。设置一个变量width用于存储树的宽度。每一层的节点入队时计算该层节点的数目,如果该层次节点的数目大于width的值,那么把该层次节点的数目赋给width.如此,对二叉树按层遍历一遍之后width中保存的就是该二叉树的宽度。

#include 
#include 
using namespace std;

typedef struct BinaryNode
{
	char data;
	struct BinaryNode *lchild;
	struct BinaryNode *rchild;
}BinaryNode,*BinaryTree;

void creatBinaryTree(BinaryTree *T)
{
	char data = 0;
	scanf("%c",&data);
	if ('#' == data)
	{
		*T = NULL;
	}
	else
	{
		(*T) = (BinaryTree)malloc(sizeof(BinaryNode));
		(*T)->data = data;
		creatBinaryTree(&(*T)->lchild);
		creatBinaryTree(&(*T)->rchild);
	}
}

void InThreading(BinaryTree T)
{
	if (T)
	{
		printf("%c ",T->data);
		InThreading(T->lchild);
		InThreading(T->rchild);
	}
}

//求二叉树的深度  
int GetDepth(BinaryNode *pRoot)  
{  
    if (pRoot == NULL)  
    {  
        return 0;  
    }

	int nLeftLength = GetDepth(pRoot->lchild);  
	int nRigthLength = GetDepth(pRoot->rchild);  
	return (nLeftLength > nRigthLength) ? (nLeftLength + 1) : (nRigthLength + 1);  
}  

//求二叉树的宽度
int GetWidth(BinaryNode *pRoot)  
{  
    if (pRoot == NULL)  
    {  
        return 0;  
    }  	
    int nLastLevelWidth = 0;//记录上一层的宽度  
    int nTempLastLevelWidth = 0;  
    int nCurLevelWidth = 0;//记录当前层的宽度  
    int nWidth = 1;//二叉树的宽度  
    queue myQueue;  
    myQueue.push(pRoot);//将根节点入队列  
    nLastLevelWidth = 1;      
    BinaryNode *pCur = NULL;  
	
    while (!myQueue.empty())//队列不空  
    {  
        nTempLastLevelWidth = nLastLevelWidth;  
        while (nTempLastLevelWidth != 0)  
        {  
            pCur = myQueue.front();//取出队列头元素  
            myQueue.pop();//将队列头元素出对  
			
            if (pCur->lchild != NULL)  
            {  
                myQueue.push(pCur->lchild);  
            }  
			
            if (pCur->rchild != NULL)  
            {  
                myQueue.push(pCur->rchild);  
            }  
			
            nTempLastLevelWidth--;  
        }  		
        nCurLevelWidth = myQueue.size();  
        nWidth = nCurLevelWidth > nWidth ? nCurLevelWidth : nWidth;  
        nLastLevelWidth = nCurLevelWidth;  
    }  	
    return nWidth;  
}  


int main()
{
	BinaryTree P;
	int Length = 0,Width = 0;
	creatBinaryTree(&P);
	InThreading(P);
	Length = GetDepth(P);
	Width = GetWidth(P);
	cout<



你可能感兴趣的:(二叉树的深度和宽度)