C. DS二叉排序树之创建和插入

题目描述

给出一个数据序列,建立二叉排序树,并实现插入功能

对二叉排序树进行中序遍历,可以得到有序的数据序列

输入

第一行输入t,表示有t个数据序列

第二行输入n,表示首个序列包含n个数据

第三行输入n个数据,都是自然数且互不相同,数据之间用空格隔开

第四行输入m,表示要插入m个数据

从第五行起,输入m行,每行一个要插入的数据,都是自然数且和前面的数据不等

以此类推输入下一个示例

输出

第一行输出有序的数据序列,对二叉排序树进行中序遍历可以得到

从第二行起,输出插入第m个数据后的有序序列,输出m行

以此类推输出下一个示例的结果

输入样例1
1
6
22 33 55 66 11 44
3
77
50
10
输出样例1
11 22 33 44 55 66 
11 22 33 44 55 66 77 
11 22 33 44 50 55 66 77 
10 11 22 33 44 50 55 66 77 

示例代码

#include<iostream>
using namespace std;
class Binode
{
public:
	int data;
	Binode* lchild, * rchild;
	Binode()
	{
		data = 0;
		lchild = NULL;
		rchild = NULL;
	}
};
class Bitree
{
public:
	Binode* root;
	Bitree()
	{
		root = NULL;
	}
	Binode* getroot()
	{
		return root;
	}
	void createtree(int n)
	{
		int data,m;
		while (n--) //创建
		{
			cin >> data;
			insert(root, data);
		}
		midorder(root);
		cout << endl;
		cin >> m; //插入数据
		while (m--)
		{
			cin >> data;
			insert(root, data);
			midorder(root);
			cout << endl;
		}
	}
	void insert(Binode*& p,int d) //引用指针参数,允许函数在执行过程中修改传入的指针变量 p 所指向的内存地址。
	{
		if (!p) //空就能插入
		{
			p = new Binode();
			p->data = d;
		}
		else if(d<p->data)
		{
			insert(p->lchild, d);
		}
		else
		{
			insert(p->rchild, d);
		}
	}
	void Insert()
	{
		int n, data;
		cin >> n;
		while (n--)
		{
			cin >> data;
			insert(root, data);
			midorder(root);
			cout << endl;
		}
	}
	void midorder(Binode* p) //中序遍历
	{
		if (p)
		{
			midorder(p->lchild);
			cout << p->data << " ";
			midorder(p->rchild);			
		}
	}
};
int main()
{
	int t,n;
	cin >> t;
	while (t--)
	{
		Bitree tree; //重要:树要写成局部变量,这样每一次都是不同的树
		cin >> n;
		tree.createtree(n);
	}
	return 0;
}

这题试了好几次,都是第一个样例过第二个不过,最后发现是把tree写在while外面了,正确解法应该写在while里面。

错误解法

int main()
{
	int t,n,m;
	cin >> t;
	Bitree tree;
	while (t--)
	{
		cin >> n;
		tree.createtree(n);
	}
	// 在此处,tree 仍然在作用范围内
}

正确解法 

int main()
{
	int t,n;
	cin >> t;
	while (t--)
	{
		Bitree tree; 
		cin >> n;
		tree.createtree(n);
	}
}

在这种情况下,每次进入 while 循环时都会创建一个新的 tree 对象,并在循环结束时销毁。每次迭代都会使用一个独立的 tree 对象,它们之间不会保留任何状态或连接关系。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为你解答关于希尔排序的问题。希尔排序是插入排序的一种改进算法,也被称为“缩小增量排序”。它的基本思想是将待排序的序列按照一定的间隔分成若干个子序列,对每个子序列进行插入排序,然后逐步缩小间隔,直到间隔为1,最后对整个序列进行一次插入排序。 希尔排序的时间复杂度与间隔序列的选择有关,最坏时间复杂度为$O(n^2)$,平均时间复杂度为$O(n \log n)$。相比于插入排序,希尔排序的时间复杂度有了明显的提升,且其在实际应用中也表现得比插入排序好。 下面是希尔排序的示例代码: ```python def shell_sort(arr): n = len(arr) gap = n // 2 while gap > 0: for i in range(gap, n): temp = arr[i] j = i while j >= gap and arr[j - gap] > temp: arr[j] = arr[j - gap] j -= gap arr[j] = temp gap //= 2 return arr ``` 在这段代码中,我们首先定义了一个希尔排序的函数shell_sort,它接收一个列表arr作为参数,并返回排好序的列表。在函数中,我们首先获取列表的长度n和初始的间隔gap,然后开始循环,直到间隔为1为止。在每次循环中,我们将列表按照间隔分成若干个子序列,对每个子序列进行插入排序,将子序列按照升序排列。最后,我们将间隔除以2,继续循环直到间隔为1。 使用希尔排序对列表进行排序非常简单,只需要调用shell_sort函数即可。例如,我们可以这样调用函数: ```python arr = [5, 2, 8, 3, 1, 6] sorted_arr = shell_sort(arr) print(sorted_arr) ``` 这段代码会输出排好序的列表[1, 2, 3, 5, 6, 8]。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值