二叉树排序
二叉排序数的(递归)定义: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; }
ps:转自www.cnblogs.com/vongang