二叉树的层序遍历题目

题目内容:

二叉搜索树在动态查表中有特别的用处,一个无序序列可以通过构造一棵二叉搜索树变成一个有序序列,

构造树的过程即为对无序序列进行排序的过程。每次插入的新的结点都是二叉搜索树上新的叶子结点,在进行

插入操作时,不必移动其它结点,只需改动某个结点的指针,由空变为非空即可。

     这里,我们想探究二叉树的建立和层次输出。

输入格式:

只有一行,包含若干个数字,中间用空格隔开。(数字可能会有重复,对于重复的数字,只计入一个)

 

输出格式:

输出一行,对输入数字建立二叉搜索树后进行按层次周游的结果。

 

输入样例:

51 45 59 86 45 4 15 76 60 20 61 77 62 30 2 37 13 82 19 74 2 79 79 97 33 90 11 7 29 14 50 1 96 59 91 39 34 6 72 7

 

输出样例:

51 45 59 4 50 86 2 15 76 97 1 13 20 60 77 90 11 14 19 30 61 82 96 7 29 37 62 79 91 6 33 39 74 34 72

提示:

输入输出的最后都不带空格和回车换行

不换行和不空格很麻烦,最后好像还有一个不太对,无非是空格的事情

中间被空指针搞了好久,绝对不能直接用*root

#include<iostream>
#include<queue>
using namespace std;
struct node//可以不用node,但没必要
{
	node*le;
	node*ri;
	int val;
	node(int a)
	{
		le = ri = NULL;
		val = a;
	}
	node() {}
};
void insert(node* newpointer,node*r)//在r结点插入z值,重的不计入
{
	node *pointer = NULL;
	pointer = r;
	while(pointer!=NULL)
	{
		if (newpointer->val == pointer->val)
		{
			return;//相等了不插
		}
		if (pointer->val > newpointer->val)
		{
			if (pointer->le == NULL)
			{
				pointer->le = newpointer;
				return;
			}
			else
			{
				pointer = pointer->le;
			}
		}
		else
		{
			if (pointer->ri == NULL)
			{
				pointer->ri = newpointer;
				return;
			}
			else
			{
				pointer = pointer->ri;
			}
		}
	}
}
void bfs(node*r)
{
	if (r == NULL)
	{
		return;
	}
	cout << r->val;
	queue<node*>q;
	if (r->le != NULL)
	{
		q.push(r->le);
	}
	if (r->ri != NULL)
	{
		q.push(r->ri);
	}
	while (!q.empty())
	{
		node*z = q.front();
			q.pop();
			cout << ' ' << z->val;
			if (z->le != 0)
			{
				q.push(z->le);
			}
			if (z->ri != 0)
			{
				q.push(z->ri);
			}
		}

}
int main()
{

	int n;
	if (cin >> n) {
		node*root = new node(n);
		while (cin >> n)
		{
			node*pointer = new node(n);
			insert(pointer, root);
		}
		bfs(root);
	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值