二叉排序树删除子节点以及遍历
生活随笔
收集整理的這篇文章主要介紹了
二叉排序树删除子节点以及遍历
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef int TElemType;
int m,n;
typedef struct BiTNode {//樹節點的建立 TElemType data ;struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
int SearchBST(BiTree T,int key,BiTree f,BiTree &p){//f代表T的父節點 if(!T){p=f; //沒找到的情況p返回訪問路徑上的最后一個節點 return 0;}else if(key==T->data){p=T; //如果找到就將此節點返回 return 1; //然后返回1代表true }else if(key<T->data)return SearchBST(T->lchild,key,T,p);else return SearchBST(T->rchild,key,T,p);
}
int InsertBST(BiTree &T,TElemType e){BiTree p,s;if(!SearchBST(T,e,NULL,p)){s=(BiTree)malloc(sizeof(BiTNode));s->data=e;s->lchild=s->rchild=NULL;if(!p) //空樹情況 T=s; //s為根節點 else if(e<p->data)//若e小時 p->lchild=s;else //e大時 p->rchild=s;return 1;}elsereturn 0; }
int CeateBiTree(BiTree &T)//創建樹
{TElemType ch;T=NULL;printf("請輸入整數序列構建二叉排序樹,以 0結束:\n");scanf("%d",&ch);while(ch!=0){// printf("請輸入整數序列構建二叉排序樹,以 0結束:\n");InsertBST(T,ch);printf("請輸入整數序列構建二叉排序樹,以 0結束:\n");scanf("%d",&ch);}
}
int Delete(BiTree &p){BiTree q,s; if(!p->rchild){ //所要刪除節點右子樹為空的情況 q=p;p=p->lchild;//用其左子樹節點代替掉此節點 free(q); }else if(!p->lchild){//若其左子樹為空 q=p;p=p->rchild; //用其右子樹節點代替掉此節點 free(q);}else{ //前兩種若p為葉子節點則直接就將p賦空 q=p; //若p的左右孩子都不為空的情況 s=p->lchild; //s為p的左孩子 while(s->rchild){ //尋找s的右孩子的右孩子的右孩子……,到最后一個右孩子 q=s;s=s->rchild;} p->data=s->data; //再用s代替此節點 if(q!=p) // p左結點沒有右節點的情況 q->rchild=s->lchild;//s的父結點指針將其右孩子指向s的左孩子 elseq->lchild=s->lchild;// Delete(s); //刪除s即可}return 1;}
int deleBiTreeData(BiTree &T,TElemType key) {int flag=1; //就是判斷樹中有無要刪除的關鍵字 if(!T) //樹為空無法刪除 return 0;else{if(key==T->data){ //找到 flag=0; return Delete(T); //將此節點刪掉 }else if(key<T->data) //key值小 return deleBiTreeData(T->lchild,key);//遍歷左子樹 elsereturn deleBiTreeData(T->rchild,key);//遍歷右子樹 }if(flag){printf("你要刪除的結點值不存在:\n");} }int PreOrder(BiTree BT) {//遞歸先序遍歷 if(BT){if(!(BT->data))return 0;printf("%3d ",BT->data);PreOrder(BT->lchild) ;PreOrder(BT->rchild);return 1;}
}
int main(){BiTree BT;TElemType ch; CeateBiTree(BT);printf("創建二叉排序樹的先序遍歷:\n");PreOrder(BT);printf("請輸入你要刪除的結點值:\n");scanf("%d",&ch) ;deleBiTreeData(BT, ch);printf("刪除節點后二叉排序樹的先序遍歷:\n");PreOrder(BT);}
?
總結
以上是生活随笔為你收集整理的二叉排序树删除子节点以及遍历的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python之数据库连接
- 下一篇: oracle 汇总上面所有,Oracle