二叉排序树(BST)构造与应用
本文取自《数据结构与算法》(C语言版)(第三版),出版社是清华大学出版社。
在VS2010中新建C++ Win32 控制台应用程序项目,创建结果截图:
二叉排序树(BST):又称二叉查找树,其定义为:二叉排序树或者是空树,或者是满足以下性质的二叉树。
(1) 若它的左子树非空,则左子树上所有记录的关键字均小于根记录的值。
(2) 若它的右子树非空,则右子树上所有记录的关键字均大于根记录的值。
(3) 左、右子树本身又各是一棵二叉排序树。
#include<stdio.h> #include<stdlib.h> #define MAX 100 typedef struct tnode { int data; struct tnode *lchild, *rchild; }TNODE; void create(); void insert(int m); //插入二叉排序树的结点 void inOrder(TNODE *ptr); //中序遍历 TNODE *root=NULL; void inOrder(TNODE *ptr) { if(ptr!=NULL) { inOrder(ptr->lchild); printf("%d ", ptr->data); inOrder(ptr->rchild); } } void create() { int n, i; int k[MAX]; printf("Please input the node number:\n"); scanf("%d", &n); for(i=0; i<n; i++) scanf("%d",&k[i]); for(i=0; i<n; i++) insert(k[i]); } void insert(int m) { TNODE *p1, *p2; if(root==NULL) { root=(TNODE *)malloc(sizeof(TNODE)); root->data=m; root->lchild=root->rchild=NULL; } else { p1=root; while(m!=p1->data) { if((m<p1->data) && (p1->lchild!=NULL)) p1=p1->lchild; else if((m>p1->data) && (p1->rchild!=NULL)) p1=p1->rchild; else if((m<p1->data) && (p1->lchild==NULL)) { p2=(TNODE *)malloc(sizeof(TNODE)); p2->data=m; p2->lchild=p2->rchild=NULL; p1->lchild=p2; return; } else if((m>p1->data) && (p1->rchild==NULL)) { p2=(TNODE *)malloc(sizeof(TNODE)); p2->data=m; p2->lchild=p2->rchild=NULL; p1->rchild=p2; return; } } } } int main() { create(); printf("\n"); inOrder(root); printf("\n"); return 0; }Ctrl+F5运行SortTree.cpp输出结果如下:
#include<stdio.h> #include<stdlib.h> #define MAX 100 typedef struct tnode { int data; struct tnode *lchild, *rchild; }TNODE; int last=0; void create(); void insert(int m); //插入二叉排序树的结点 void findMaxMin(int aim, TNODE *ptr); TNODE *root=NULL; void findMaxMin(int aim, TNODE *ptr) { if(ptr!=NULL) { findMaxMin(aim, ptr->lchild); if(last<aim && ptr->data>=aim) //找到小于aim的最大元素 printf("a=%d\n",last); if(last<=aim && ptr->data>aim) //找到大于aim的最小元素 printf("b=%d\n",ptr->data); last=ptr->data; findMaxMin(aim, ptr->rchild); } } void create() { int n, i; int k[MAX]; printf("Please input the node number:\n"); scanf("%d", &n); for(i=0; i<n; i++) scanf("%d",&k[i]); for(i=0; i<n; i++) insert(k[i]); } void insert(int m) { TNODE *p1, *p2; if(root==NULL) { root=(TNODE *)malloc(sizeof(TNODE)); root->data=m; root->lchild=root->rchild=NULL; } else { p1=root; while(m!=p1->data) { if((m<p1->data) && (p1->lchild!=NULL)) p1=p1->lchild; else if((m>p1->data) && (p1->rchild!=NULL)) p1=p1->rchild; else if((m<p1->data) && (p1->lchild==NULL)) { p2=(TNODE *)malloc(sizeof(TNODE)); p2->data=m; p2->lchild=p2->rchild=NULL; p1->lchild=p2; return; } else if((m>p1->data) && (p1->rchild==NULL)) { p2=(TNODE *)malloc(sizeof(TNODE)); p2->data=m; p2->lchild=p2->rchild=NULL; p1->rchild=p2; return; } } } } int main() { int toBeFind; create(); printf("\n"); printf("Input the record to be finded! \n"); scanf("%d", &toBeFind); findMaxMin(toBeFind, root); printf("\n"); return 0; }