算法实验 层序列表问题(二叉树)

问题描写叙述:对树中结点按层序列表是指先列树根,然后从左到右一次列出全部深度为1的节点,再从做到右地列出深度为2的节点,等等。层序列表问题要求对一颗给定的二叉树按层序列表。

数据输入:第一行为一个整数n,表示给定的二叉树有n个顶点。接下来的n行中,每行有3个整数a,b,c 分别表示编号为a的节点的左儿子b和右儿子c。

5
1 4 2
4 3 0
2 5 0
3 0 0
5 0 0


output:

1 4 2 3 5

代码:

#include<iostream>
#include<queue>
using namespace std;
//全局变量
int t1,t2,t3;
typedef struct BTNode
{  
	int  data ;
	struct BTNode *Lchild , *Rchild ;
}BTNode ;
queue<BTNode *> q;
void  *Preorder_Create_BTree(BTNode  *&T,int k);
void InOrder(BTNode *t);
void InOrder(BTNode *t);
void add(BTNode *&t,int m)
{  
    if (t){ // T=NULL时,二叉树为空树,不做不论什么操作
		if(t->data == m)//符合条件,则进行左孩子和右孩子加入
		{
			Preorder_Create_BTree(t->Lchild,t2);
			Preorder_Create_BTree(t->Rchild,t3);		
		}// 通过函数指针*visit訪问根结点,以便灵活完毕对应的操作
		else
		add(t->Lchild,m);   // 中序遍历左子树
		add(t->Rchild,m); // 中序遍历右子树
    }
}
/*
//前序遍历
void InOrder(BTNode *t)
{  
    if (t){ // T=NULL时,二叉树为空树,不做不论什么操作
		cout<<t->data<<" "; // 通过函数指针*visit訪问根结点,以便灵活完毕对应的操作
		InOrder(t->Lchild);   // 中序遍历左子树
		InOrder(t->Rchild); // 中序遍历右子树
    }
}
*/

//层序遍历
void levelOrder(BTNode *t)
{
	BTNode *k;
	q.push(t);
	while(!q.empty())
	{
		k = q.front();
		q.pop();
		cout<<k->data<<" ";
		if(k->Lchild) q.push(k->Lchild);
		if(k->Rchild) q.push(k->Rchild);
	}
}

int main()
{	int n,i,flag= 1;
	BTNode * bt;
	Preorder_Create_BTree(bt,0);
	cin>>n;
	
	for(i=0;i<n;i++)
	{
		cin>>t1>>t2>>t3;
		if(flag)//第一次应该先加入节点
		{
			Preorder_Create_BTree(bt,t1);
			Preorder_Create_BTree(bt->Lchild,t2);
			Preorder_Create_BTree(bt->Rchild,t3);
			flag = 0;
		}
//	
		else//之后每加入一次须要再遍历二叉树,符合条件然后加入
		add(bt,t1);
	}
//	cout<<"中序遍历:";
//	InOrder(bt);
//	cout<<endl;
	levelOrder(bt);
	return 0;
}


void  *Preorder_Create_BTree(BTNode  *&T,int k)
 /*   建立链式二叉树,返回指向根结点的指针变量  */
{   
//	char ch ; 
//	ch=getchar() ;
	if  (k==0) 
	{    
		T=NULL;  
		return(T) ;  
	}
	else
	{  
		T=(BTNode *)malloc(sizeof(BTNode)) ;
		T->data=k;
		Preorder_Create_BTree(T->Lchild,0) ;
		Preorder_Create_BTree(T->Rchild,0) ;
		 
	}
}      


原文地址:https://www.cnblogs.com/lcchuguo/p/4469558.html