ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

3005基于二叉链表的二叉树最大宽度的计算

2021-11-11 14:03:45  阅读:150  来源: 互联网

标签:lchild 3005 结点 LNode tree 链表 二叉树 rchild


描述

设二叉树中每个结点的元素均为一个字符,按先序遍历的顺序建立二叉链表,编写算法计算该二叉树的最大宽度(二叉树的最大宽度是指二叉树所有层中结点个数的最大值)。

输入

多组数据。每组数据一行,为二叉树的先序序列(序列中元素为‘0’时,表示该结点为空)。当输入只有一个“0”时,输入结束。

输出

每组数据输出一行。为二叉树的最大宽度。

输入样例 1 

abcd00e00f00ig00h00
abd00e00cf00g00
0

输出样例 1

4
4
//基于二叉链表的二叉树最大宽度的计算 
#include <iostream>
using namespace std;
typedef struct LNode{
	char data; //存储这个结点的数据
	LNode *lchild; //结点的左子结点
	LNode *rchild; //结点的右子结点 
	LNode *parent; //结点的父结点
}LNode,*Tree;
void GetTree(Tree &tree,string::iterator &it){ //递归创建树 
	if(*it=='0'){ //如果读取到0 直接返回 iterator往后走 
		it++;
		return;
	}
	tree->data=*it; //(此时it必没有读到0) 赋值 
	it++; //it往后走 
	if(*it!='0'){tree->lchild=new LNode;tree->lchild->lchild=tree->lchild->rchild=tree->lchild->parent=NULL;} //如果it不是0就创建左子树 否则不创建;创建的时候要令它左右子树、父结点为空 不然会出问题 
	GetTree(tree->lchild,it);//对左子树进行创建;如果it指向0 结果就是it++ 不创建左子树 不影响程序 
	if(*it!='0'){tree->rchild=new LNode;tree->rchild->lchild=tree->rchild->rchild=tree->rchild->parent=NULL;} //如果it不是0就创建右子树 否则不创建;创建的时候要令它左右子树、父结点为空 不然会出问题
	GetTree(tree->rchild,it);//对右子树进行创建;如果it指向0 结果就是it++ 不创建左子树 不影响程序 
}
int Get_max_len(Tree &tree,int a[],int i){ //将树的宽度存入a数组,并返回树的高度 
	a[i]++;
	int m=0,n=0;//m和n分别代表左右子树的高度 
	if(!tree->lchild&&!tree->rchild) return 1;//左右子树都没有 返回一层
	if(tree->lchild) m=Get_max_len(tree->lchild,a,i+1); //操作左子树 令i往后移一位 并保存左子树的高度给m 
	if(tree->rchild) n=Get_max_len(tree->rchild,a,i+1); //操作右子树 令i往后移一位 并保存右子树的高度给n 
	return max(m,n)+1;//返回左右子树最高的高度+1 
}
void Calculate(string str){
	int a[100]={0};//用于存储各个树各层的宽度(由于叶子结点不一定在同一层,我们只能采用数组的方式计算高度而不能采用递归返回的方式) 
	Tree tree=new LNode;
	tree->lchild=tree->rchild=tree->parent=NULL;
	std::string::iterator it=str.begin();
	GetTree(tree,it); //创造a树
	int high=Get_max_len(tree,a,0);//将树的宽度存入a数组,并返回树的高度
	int max=a[0]; //用于存储最大的宽度 
	for(int i=1;i<high;i++)
		if(max<a[i]) max=a[i]; //如果有更大的宽度就替换他 
	cout<<max<<endl;
}
int main(){
	string str; //一行数据 
	while(cin>>str&&str!="0") //输入一行数据到只有零为止 
		Calculate(str);
	return 0;
} 

标签:lchild,3005,结点,LNode,tree,链表,二叉树,rchild
来源: https://blog.csdn.net/qq_51135645/article/details/121266502

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有