資料結構 二叉排序樹 操作及實現
阿新 • • 發佈:2019-01-07
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> using namespace std; typedef struct Bitnode { int data; struct Bitnode *lchild,*rchild; } Bitnode,*Bitree; int Searchtree(Bitree T,int num,Bitree F,Bitree &P) //在二叉樹T種查詢元素num F表示前驅 P表示num元素所在的節點 { if(T==NULL) //未找到該元素 { P=F; //p表示num元素應當在的位置的前驅 return 0; } else if(T->data==num) { P=T; return 1; } else if(T->data<=num) Searchtree(T->rchild,num,T,P); else Searchtree(T->lchild,num,T,P); } void print_in(Bitree &T) //中序遍歷排序二叉樹 { if(T!=NULL) { print_in(T->lchild); printf("%d ",T->data); print_in(T->rchild); } return; } void insertTree(Bitree &T,int num) //在二叉排序樹T中插入元素NUM { Bitree P,s; int flag=Searchtree(T,num,NULL,P); if(flag==0) { s=(Bitree)malloc(sizeof(Bitnode)); s->data=num; s->lchild=NULL; s->rchild=NULL; if(T==NULL) T=s; else if(num<P->data) P->lchild=s; else P->rchild=s; } return; } void deletenode(Bitree &T) //刪除該節點 { Bitree q,s; if(T->rchild==NULL) { q=T; T=T->lchild; free(q); } else if(T->lchild==NULL) { q=T; T=T->rchild; free(q); } else { q=T; s=q->lchild; while(s->rchild) { q=s; s=s->rchild; } T->data=s->data; if(T==q) //T=q 表示 while迴圈沒有執行 T的左兒子的右子樹沒有節點 q->lchild=s->lchild; else q->rchild=s->lchild; free(s); } return; } void Deletetree(Bitree &T,int num) //在樹種刪除元素num { if(T==NULL) return; if(T->data<num) Deletetree(T->rchild,num); else if(T->data>num) Deletetree(T->lchild,num); else //找到相同的節點 刪除節點操作 { // cout<<111<<endl; deletenode(T); } return; } int main() { int m,n,k; int a; Bitree T=NULL; Bitree q; int i,j; printf("輸入n個元素和k次查詢操作和m次刪除操作:\n"); scanf("%d%d%d",&n,&k,&m); while(n--) { int num; scanf("%d",&num); insertTree(T,num); } printf("中序遍歷結果\n"); print_in(T); cout<<endl; while(k--) { printf("請輸入要查詢的元素:\n"); scanf("%d",&a); int ans=Searchtree(T,a,NULL,q); cout<<ans<<endl; } while(m--) { printf("請輸入要刪除的元素:\n"); scanf("%d",&a); Deletetree(T,a); print_in(T); cout<<endl; } return 0; } 測試資料: 8 3 3 5 7 8 9 10 15 3 1 9 2 5 10 1 15