二叉树的深度和宽度

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

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

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

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

1)求二叉树的深度

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

2)求二叉树的宽度

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

#include <iostream>
#include <queue>
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<BinaryNode *> 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<<endl<<Length<<endl<<Width<<endl; 	
	system("pause");
	return 0;
}



### 二叉树的高度宽度概念 #### 高度定义 对于任意节点n,如果该节点为空,则其高度为0;如果节点不为空,那么它的高度等于左子树右子树中的最大高度加1。整棵树的高度即根节点的高度[^1]。 #### 宽度定义 二叉树宽度是指每一层上的节点数目最多的一层所含有的节点数量。具体来说,在所有层次中找到拥有最多节点的那一层,这一层数量最多的节点数就是这棵二叉树宽度[^4]。 ### 计算方法 #### 计算高度的方法 为了求解二叉树的高度,可以采用递归的方式来进行: ```python def tree_height(node): if node is None: return 0 else: left_height = tree_height(node.lchild) right_height = tree_height(node.rchild) # 返回左右子树较大者加上当前节点自身的贡献(1) return max(left_height, right_height) + 1 ``` 这段Python代码实现了上述提到的逻辑,通过不断向下访问直到叶子节点再逐级返回来获得整个树的最大深度。 #### 计算宽度的方法 要得到二叉树宽度,可以通过广度优先搜索(BFS),利用队列保存每层的所有节点,并统计各层的大小找出其中最大的一层作为最终的结果: ```python from collections import deque def tree_width(root): if root is None: return 0 queue = deque([root]) max_width = 0 while queue: level_length = len(queue) max_width = max(max_width, level_length) for _ in range(level_length): current_node = queue.popleft() if current_node.lchild: queue.append(current_node.lchild) if current_node.rchild: queue.append(current_node.rchild) return max_width ``` 此段程序展示了如何基于给定的`BiTree`结构体类型计算一棵二叉树的最大宽度[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值