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

问题描写叙述:对树中结点按层序列表是指先列树根,然后从左到右一次列出全部深度为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) ;

	}
}
时间: 2024-08-25 11:23:18

算法实验 层序列表问题(二叉树)的相关文章

算法实验1--算法排序比较

一.实验目的: 比较至少4种排序算法的执行效率.已学过的算法:起泡排序.选择排序.插入排序.shell排序,归并排序.快速排序等. 二.实验要求: 1.从中选择至少4中排序算法,写成独立的函数进行调用. 2.参与排序的数据不少于5000个,要求用数据文件存储随机产生的数据. 3.要求在main()函数中调用以上函数,并输出各排序算法所用时间. 三.问题描述: 通过至少四种排序算法设计,功能实现,计算出完成随机生成的至少5000个数所需要的时间,并比较各种算法的效率. 四.算法分析: 随机数存入文

一步一步写算法(之哈希二叉树)

原文:一步一步写算法(之哈希二叉树) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 用过平衡二叉树的朋友都清楚,平衡二叉树的最大优点就是排序.不管是在数据插入的时候还是在数据删除的时候,我们都要考虑到数据的排序情况.但是和数据的添加.删除一样重要的,还有数据的查询.很不幸,平衡二叉树经常由于节点的添加和删除,数据的查询效率会变得非常低下.朋友们可以看看下面这样的一个极端场景,所有分支节点都只有一边存在数据: /* * 7 3 * / *

层序遍历打印二叉树

比如输入的二叉树是 E D             G A B C F 要求打印出的结果是 E D G A B C F 字母之间用空格隔开,不同层用换行隔开. 1 #include <iostream> 2 #include <vector> 3 #include <string> 4 #include <queue> 5 #include <stack> 6 #include <unordered_map> 7 #include &

算法实验11:还是畅通工程(最小生成树 kruscal prim)

算法实验11:还是畅通工程 Description 某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离.省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小.请计算最小的公路总长度. Input 测试输入包含若干测试用例.每个测试用例的第1行给出村庄数目N ( < 100 ):随后的N(N-1)/2行对应村庄间的距离,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间的距离.为简单起

二叉树的层序遍历、二叉树叶节点输出算法、求二叉树的高度、层序创建一棵二叉树

二叉树的层序遍历 1 void LevelorderTraversal(BinTree BT) 2 { 3 std::queue<BinTree> Queue; 4 BinTree T; 5 if (!BT) 6 return; //若是空树则直接返回 7 Queue.push(BT); 8 while (!Queue.empty()) 9 { 10 T = Queue.front(); 11 Queue.pop(); 12 printf("%c ", T->Data

算法实验-二叉树的创建和前序-中序-后序-层次 遍历

对于二叉树的创建我是利用先序遍历的序列进行创建 能够对于树节点的内容我定义为char型变量 '0'为空,即此处的节点不存在 头文件 Tree.h //链式二叉树的头文件 #pragma once #include<iostream> #include<queue> using namespace std; class BinaryTreeNode { public: char data; BinaryTreeNode *leftChild,*rightChild; BinaryTr

设计一个算法,求非空二叉树中指定的第k层(k&gt;1)的叶子节点的个数

思想:采用基于层序遍历的方法.用level扫描各层节点,若某一层的节点出队后,rear指向该层中最右节点,则将rear赋值给last(对于第一层,last=1).在出队时,若front=last,表示这一层处理完毕,让层号level增1,并置last为下一层最右节点.那么如何求一层的最右节点呢?这是因为第一层只有一个节点,它就是最右节点.对于其他层,上一层最右节点最后进队的孩子一定是该层的最右节点. 例如,对于如图所示的二叉树,求k=3的叶子节点个数的过程如下:level=1;A进队时rear=

二叉树的层序遍历和二叉树的线索化

先根,后子树:先左子树,后右子树 二叉树的根节点 a 入队 a 的子树,根节点 b 和 c 分别入队 然后 b 的子树的根节点入队(为空) c 的子树的根节点入队 d 的子树的根节点入队(为空) e 的子树的根节点入队 f 的子树的根节点入队(为空) g的子树的根节点入队(为空)结束层序遍历,整个过程就是一层层的遍历,依靠一个队列来存放临时查找的结点. 二叉树线索化 问题的提出:当以二叉链表作为存储结构时,只能找到结点的左右孩子的信息,而不能直接找到结点的任一序列的前驱与后继信息,这种信息只有在

算法实验:分治法合并排序(C++)

这篇文章分两部分来写,第一部分写代码的实现过程,第二部分把实验报告从头到尾呈现出来. 我习惯调试使用的编译器是DEV C++,不是vs系列的,可能头文件上有点区别.但是下面的报告是我放到vs里面测试过的,可以直接用,不影响. 第一部分:(解析) 题目:随机产生一个整型数组,然后用合并排序将该数组做升序排列,要求输出排序前和排序后的数组. 题目分析: 需要随机产生一个整数数组: 采用的算法是合并排序,也就是用归并排序: 输出排序后的数组. 随机产生一个整数数组:这个问题首先想到的是用rand()函