1. 程式人生 > >二叉查詢樹的4個變種

二叉查詢樹的4個變種

DelBST1  遞迴實現 直接刪點

DelBST2 遞迴實現 換值刪點

DelBST3 非遞迴實現 直接刪點

DelBST4 非遞迴實現 換值刪點

文中所有程式碼暫時未進行編譯若有小錯誤請見諒

#include <bits/stdc++.h>
using namespace std;
#define  KeyType  int
#define ENDKEY -1
typedef struct node{
    KeyType key;
    struct node *lchild, *rchild;
}BSTNode, 
*BSTree; void InsertBST(BSTree *bst, KeyType key){ BSTree s; if(*bst == NULL){ s = (BSTree)malloc(sizeof(BSTNode)); s->key = key; s->lchild = NULL; s->rchild = NULL; *bst = s; } else if(key < (*bst)->key) InsertBST(&((*bst)->lchild), key);
else if(key > (*bst)->key) InsertBST(&((*bst)->rchild), key); } void creatBST(BSTree *bst){ KeyType key; *bst = NULL; cin>>key; while(key != ENDKEY){ InsertBST(bst, key); cin>>key; } } BSTree SearchBST(BSTree bst, KeyType key){
if(!bst) return NULL; else if(bst->key == key) return bst; else if(bst->key > key) return SearchBST(bst->lchild, key); else return SearchBST(bst->rchild, key); } //遞迴寫法1 BSTNode *DelBST(BSTree t, KeyType k){ if(k > t->key){ return t->rchild = DelBST(t->rchild, k); } else if( k < t->key) return t->lchild = DelBST(t->lchild, k); else{ if(t->rchild == NULL){ return t->lchild; } if(t->lchild == NULL){ return t->rchild; } BSTNode *p = t->lchild, *fp = p; //find the biggest number in point t Left tree while(p->rchild){ fp = p; p = p->rchild; } if(t->lchild != p){ fp->rchild = NULL; p->lchild = t->lchild; p->rchild = t->rchild; } p->rchild = t->rchild; free(t); return p; } } //遞迴寫法2(值交換 BSTNode *DelBST2(BSTree t, KeyType k){ if(k > t->key){ return t->rchild = DelBST2(t->rchild, k); } else if( k < t->key) return t->lchild = DelBST2(t->lchild, k); else{ if(t->rchild == NULL){ return t->lchild; } if(t->lchild == NULL){ return t->rchild; } BSTNode *p = t->lchild, *fp; //find the biggest number in point t Left tree while(p->rchild){ fp = p; p = p->rchild; } if(t->lchild != p){ fp->rchild = p->lchild; } t->lchild = p->lchild; t->key = p->key; free(p); return t; } } //非遞迴 BSTNode *DelBST3(BSTree t, KeyType k){ BSTree *p, *fp = nullptr; p = t; while(p){ if(p->key < k){ fp = p; p = p->rchild; } else if(p->key > k){ fp = p; p = p->lchild; } else break; } if(p == nullptr) return t; if(p->lchild == nullptr){ if(fp == nullptr){ fp = p->rchild; free(p); return fp; } else if(fp->lchild == p){ fp->lchild = p->rchild; free(p); return t; } else if(fp->rchild == p){ fp->rchild = p->rchild; free(p); return t; } } if(p->rchild == nullptr){ if(fp == nullptr){ fp = p->lchild; free(p); return fp; } else if(fp->lchild == p){ fp->lchild = p->lchild; free(p); return t; } else if(fp->rchild == p){ fp->rchild = p->rchild; free(p); return t; } } //find the biggest number in left Tree BSTree *tmp = p->lchild, *tmp2; while(tmp->rchild){ tmp2 = tmp; tmp = tmp->rchild; } if(tmp != tmp2){ tmp2->rchild = nullptr; tmp->lchild = p->lchild; tmp->rchild = p->rchild; } tmp->rchild = p->rchild; free(p); return t; } BSTNode *DelBST4(BSTree t, KeyType k){ BSTree *p, *fp = nullptr; p = t; while(p){ if(p->key < k){ fp = p; p = p->rchild; } else if(p->key > k){ fp = p; p = p->lchild; } else break; } if(p == nullptr) return t; if(p->lchild == nullptr){ if(fp == nullptr){ fp = p->rchild; free(p); return fp; } else if(fp->lchild == p){ fp->lchild = p->rchild; free(p); return t; } else if(fp->rchild == p){ fp->rchild = p->rchild; free(p); return t; } } if(p->rchild == nullptr){ if(fp == nullptr){ fp = p->lchild; free(p); return fp; } else if(fp->lchild == p){ fp->lchild = p->lchild; free(p); return t; } else if(fp->rchild == p){ fp->rchild = p->rchild; free(p); return t; } } //find the biggest number in left Tree BSTree *tmp = p->lchild, *tmp2; while(tmp->rchild){ tmp2 = tmp; tmp = tmp->rchild; } if(tmp != p->lchild){ tmp2->rchild = tmp->lchild; } p->lchild = tmp->lchild; p->key = tmp->key; return t; }