题目描述
给出一个数据序列,建立二叉排序树,并实现插入功能
对二叉排序树进行中序遍历,可以得到有序的数据序列
输入
第一行输入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
NOTICE:
二叉排序树的创建:本质就是多次插入;
二叉排序树的插入:根据插入元素的大小走这棵树,直到走到空指针,在空指针的地方插入;期间我们要知道当前结点的双亲指针,以便于最后插入时改变双亲的左孩子或右孩子;
#include <iostream>
using namespace std;
class BiTreeNode
{
private:
int data;
BiTreeNode* lchild;
BiTreeNode* rchild;
public:
BiTreeNode(int a)
{
data = a;
lchild = nullptr;
rchild = nullptr;
}
friend class BiTree;
};
class BiTree
{
private:
BiTreeNode* root;
void inorder(BiTreeNode* t)
{
if (t)
{
inorder(t->lchild);
cout << t->data << " ";
inorder(t->rchild);
}
}
public:
BiTree() :root(nullptr) {}
void insert(int num)
{
BiTreeNode* t = new BiTreeNode(num);
if (root == nullptr)
{
root = t;
}
else
{
BiTreeNode* p = root;
BiTreeNode* q = nullptr;//指向p节点的双亲
while (1)
{
//找到插入点
if (p == nullptr)
{
//插左孩子还是右孩子?
if (num < q->data)
{
q->lchild = t;
}
else if (num > q->data)
{
q->rchild = t;
}
break;
}
if (num < p->data)//往左走
{
q = p;
p = p->lchild;
}
else if (num > p->data)//往右走
{
q = p;
p = p->rchild;
}
}
}
}
void inorder()
{
inorder(root);
cout << endl;
}
};
int main()
{
int t;
cin >> t;
while (t--)
{
int n, m;
BiTree tree;
//创建的本质是多次插入
cin >> n;
for (int i = 0; i < n; i++)
{
int num;
cin >> num;
tree.insert(num);
}
tree.inorder();
cin >> m;
for (int i = 0; i < m; i++)
{
int num;
cin >> num;
tree.insert(num);
tree.inorder();
}
}
return 0;
}
本文介绍如何通过给定的数据序列构建二叉排序树,并实现插入功能。通过对树进行中序遍历,可以获得有序数据序列。文章还提供了完整的C++代码实现。
1041

被折叠的 条评论
为什么被折叠?



