超链接:二叉搜索树
-
总Time Limit:
- 1000ms Memory Limit:
- 1024kB
-
Description
-
二叉搜索树在动态查表中有特别的用处,一个无序序列可以通过构造一棵二叉搜索树变成一个有序序列,构造树的过程即为对无序序列进行排序的过程。每次插入的新的结点都是二叉搜索树上新的叶子结点,在进行插入操作时,不必移动其它结点,只需改动某个结点的指针,由空变为非空即可。
这里,我们想探究二叉树的建立和序列输出。
Input
- 只有一行,包含若干个数字,中间用空格隔开。(数字可能会有重复) Output
- 输出一行,对输入数字建立二叉搜索树后进行前序周游的结果。 Sample Input
-
41 467 334 500 169 724 478 358 962 464 705 145 281 827 961 491 995 942 827 436
Sample Output
-
41 467 334 169 145 281 358 464 436 500 478 491 724 705 962 827 961 942 995
分析:
二叉搜索树:它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。--来自《百度百科》
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
struct node{
node * l,*r;
int data;
node():l(NULL),r(NULL),data(0){}
};
void preOrder(node *tmp)
{
if(!tmp) return;
cout << tmp->data << ' ';
preOrder(tmp->l);
preOrder(tmp->r);
}
int main()
{
int a;
node *root = new node();
while(cin >> a) {
node * tmp = root;
while((tmp != NULL) && (tmp->data !=0)) { // tmp->data != 0主要是限制根节点
if(a == tmp->data) break; // 相同值跳过
else if(a < tmp->data) { // 往左子树插值
if(tmp->l == NULL) {
tmp->l = new node(),tmp = tmp->l;break;
}tmp = tmp->l;
}
else { // 往右子树插值
if(tmp->r == NULL) {
tmp->r = new node(),tmp = tmp->r;break;
}else tmp = tmp->r;
}
}
tmp->data = a;
}
preOrder(root);
return 0;
}
ps:程序执行完毕后,操作系统会回收该程序申请的所有内存,但是从专业素养的角度考虑,还是养成释放内存的习惯。
在preOrder(root)后加上delTree()函数。
void delTree(node *tmp)
{
if(!tmp) return;//像preOrder那样写也行
delTree(tmp->l);
delTree(tmp->r);
delete tmp;
}
int main()
{
...
preOrder(root);
delTree(root);
return 0;
}