二叉树的深度和宽度

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

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

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

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;
}



在C++中,计算二叉树的最大宽度通常采用层序遍历(BFS,即广度优先搜索)的方法。这里提供一个基本步骤: 1. 定义一个队列(deque),用于存储当前层的所有节点,初始化时将根节点放入队列。 2. 初始化一个变量`width`记录当前层的节点数,以及一个变量`max_width`记录已找到的最大宽度,初始值均为1(因为至少有一层)。 3. 当队列非空时,循环进行以下操作: a. 弹出队列头部元素,并将其左右子节点(如果有)加入队列。 b. 更新当前层的宽度,如果节点数大于`max_width`,则更新`max_width`。 4. 遍历完所有节点后,`max_width`即为二叉树的最大宽度。 以下是伪代码和简化版本的C++代码实现: ```cpp #include <iostream> #include <queue> using namespace std; // 假设二叉树节点定义为 Node 类 struct Node { int val; Node* left; Node* right; }; int maxDepth(Node* root) { if (root == nullptr) return 0; queue<Node*> q; q.push(root); int depth = 0, width = 1; // 初始深度为1,宽度为1 while (!q.empty()) { int size = q.size(); for (int i = 0; i < size; ++i) { Node* node = q.front(); q.pop(); if (node->left) q.push(node->left); if (node->right) q.push(node->right); } width = max(width, size); // 更新宽度 depth++; } return depth; } int main() { Node* root = ... // 填充二叉树节点 int maxWidth = maxDepth(root); cout << "The maximum width of the binary tree is: " << maxWidth << endl; return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值