二叉排序树

VonGang原创,转载请注明:http://www.cnblogs.com/vongang/

二叉排序数的(递归)定义:1、若左子树非空,则左子树所有节点的值均小于它的根节点;2、若右子树非空,则右子树所有节点的值均大于于它的根节点;3、左右子树也分别为二叉排序树。

如图:

链表实现(比较简单):

View Code
#include <stdio.h>
#include
<malloc.h>

typedef
struct node
{
int data;
struct node * lchild;
struct node * rchild;
}node;

void Init(node *t)
{
t
= NULL;
}

node
* Insert(node *t , int key)
{
if(t == NULL)
{
node
* p;
p
= (node *)malloc(sizeof(node));
p
->data = key;
p
->lchild = NULL;
p
->rchild = NULL;
t
= p;
}
else
{
if(key < t->data)
t
->lchild = Insert(t->lchild, key);
else
t
->rchild = Insert(t->rchild, key);
}
return t; //important!
}

node
* creat(node *t)
{
int i, n, key;
scanf(
"%d", &n);
for(i = 0; i < n; i++)
{
scanf(
"%d", &key);
t
= Insert(t, key);
}
return t;
}

void InOrder(node * t) //中序遍历输出
{
if(t != NULL)
{
InOrder(t
->lchild);
printf(
"%d ", t->data);
InOrder(t
->rchild);
}
}

int main()
{
node
* t = NULL;
t
= creat(t);
InOrder(t);
return 0;
}

数组实现(这个有意思):

定义left[], right[]作为标记,记录但前节点是哪个点的左(右)孩子

比如我们要对 4,3, 8,6,1。排序排好序后的二叉树如图:

把这个过程在纸上用笔走一遍,你就会一目了然。

My Code:

#include <stdio.h>
#include
<string.h>
#define N 1000

int l[N], r[N], key[N], flag, root;

void insert(int index, int x)
{
if(x <= key[index])
{
if(l[index] == -1) l[index] = flag;
else insert(l[index], x);
}
else
{
if(r[index] == -1) r[index] = flag;
else insert(r[index], x);
}
}
void InOrder(int index)
{
if(l[index] != -1) InOrder(l[index]);
printf(
"%d ", key[index]);
if(r[index] != -1) InOrder(r[index]);
}

int main()
{
int i, x, n;
memset(l,
-1, sizeof(l));
memset(r,
-1, sizeof(r));

scanf(
"%d", &n);
root
= -1;
flag
= 0;

for(i = 0; i < n; i++)
{
scanf(
"%d", &x);
if(root == -1) key[++root] = x;
else
{
key[
++flag] = x;
insert(root, x);
}
}
InOrder(root);
return 0;
}
posted @ 2011-08-17 15:54  AC_Von  阅读(389)  评论(0编辑  收藏  举报