BST二叉查找树的实现与操作
原文来自猎豹网校
#include <stdio.h> #include <stdlib.h> typedef struct Node { int data; struct Node *lchild; struct Node *rchild; }BiTreeNode,*BiTree; BiTree BSTSearch(BiTree T,int x) { BiTreeNode *p; if(T!=NULL) { p=T; while(p!=NULL) { if(p->data==x) return p; else if(x<p->data) p=p->lchild; else if(x>p->data) p=p->rchild; } } return NULL; } int BSTInsert(BiTree *T,int x) { BiTreeNode *p,*cur,*parent=NULL; cur=*T; while(cur!=NULL) { if(cur->data==x) return 0;//已存在关键字为x的节点 parent=cur; if(x<cur->data) cur=cur->lchild; else cur=cur->rchild; } p=(BiTreeNode *)malloc(sizeof(BiTreeNode)); if(!p) exit(-1); p->data=x; p->lchild=NULL; p->rchild=NULL; if(!parent) *T=p; else if(x<parent->data)//如果关键字小于parent指向的节点,则新节点成为parent左孩子 parent->lchild=p; else parent->rchild=p; return 1; } //删除结点操作 void DeleteNode(BiTree *s) { BiTree q,x,y; if(!(*s)->rchild) { q=*s; *s=(*s)->lchild; free(q); } else if(!(*s)->lchild) { q=*s; *s=(*s)->rchild; free(q); } else//如果s左右子树都存在,则使s的直接前驱结点代替s,并使直接前驱结点的左子树成为成为双亲节点的右子树结点。 { x=*s; y=(*s)->lchild; while(y->rchild!=NULL)//查找s的直接前驱结点y为s的直接前驱结点,x为y的双亲结点 { x=y; y=y->rchild; } (*s)->data=y->data;//结点s被y取代 if(x!=*s) x->rchild=y->lchild;//使y的左子树成为x的右子树 else//如果s的左孩子结点不存在右子树 x->lchild=y->lchild; free(y); } } //删除特定结点操作 int BSTDelete(BiTree *T,int x) { if(!*T) return 0; else { if(x==(*T)->data) DeleteNode(T); else if((*T)->data>x) BSTDelete(&(*T)->lchild,x); else BSTDelete(&(*T)->rchild,x); } } void InOrderTraverse(BiTree T) { if(T) { InOrderTraverse(T->lchild); printf("%4d",T->data); InOrderTraverse(T->rchild); } }