/********************************************************* 二叉树排序树的的构造和查找 *********************************************************/ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <iostream> #include <stack> using namespace std; #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 #define EQ(a,b) ((a) == (b)) #define LT(a,b) ((a) < (b)) #define LQ(a,b) ((a) <= (b)) #define InitDSTable Init #define DestroyDSTable Destroy #define TraverseDSTable InOrderTraverse typedef int Status; //typedef char TElemType[12]; typedef int KeyType; struct ElemType //数据元素类型 { KeyType key; int others; }; typedef struct BiTNode { ElemType data; BiTNode* lchild, *rchild; } BiTNode, *BitTree; void print(ElemType c) { printf("(%d,%d) ", c.key, c.others); } void Init(BitTree& T) { T = NULL; } void Destroy(BitTree& T) { if(T) { if(T->lchild) { Destroy(T->lchild); } if(T->rchild) { Destroy(T->rchild); } free(T); T = NULL; } } Status Empty(BitTree T) { if(T) { return FALSE; } else { return TRUE; } } //中序遍历 void InOrderTraverse(BitTree T) { if(T) { InOrderTraverse(T->lchild); printf("%d ", T->data.key); InOrderTraverse(T->rchild); } } Status SearchBST(BitTree& T, KeyType key, BitTree f, BitTree& p) { //在根指针T所指排序二叉树中递归地查找某关键字等于key的数据元素,若查找成功,则指针p只想该数据元素节点,并返回TRUE;否则指针p指向查找路径上访问的最后一个节点并返回FALSE,指针f指向T的双亲,其初始调用值为NULL if(!T) { //查找不成功 p = f; return FALSE; } else if EQ(key, T->data.key) { p = T; return TRUE; } else if LT(key, T->data.key) { return SearchBST(T->lchild, key, T, p); } else { return SearchBST(T->rchild, key, T, p); } } Status InsertBST(BitTree& T, ElemType e) { //当排序二叉树T中不存在关键字等于e.key的元素时,插入e并返回TRUE,否则返回FALSE。 BitTree p, s; if(!SearchBST(T, e.key, NULL, p)) { s = (BitTree)malloc(sizeof(BiTNode)); s->data = e; s->lchild = s->rchild = NULL; if(!p) { T = s; //被插节点s为新的根节点 } else if LT(e.key, p->data.key) { p->lchild = s; } else { p->rchild = s; } return TRUE; } //树种已经有关键字相同的节点,不再插入 else { return FALSE; } } void Delete(BitTree& p) { //从排序二叉树中删除节点p,并重接它的左或右子树 BitTree q, s; if(!p->rchild) { //p的右子树空,则只需要重接它的左字树 q = p; p = p->lchild; free(q); } else if(!p->lchild) { //p的左子树为空,只需要重接它的右子树 q = p; p = p->rchild; free(q); } else { //左右子树均不为空 q = p; s = p->lchild; while(s->rchild) { //转左,然后向右到尽头(找待删除节点的前驱) q = s; s = s->rchild; } p->data = s->data; //s指向被删除节点的“前驱”(将被删除节点的前驱的值取代被删除节点的值) if(q != p) { q->rchild = s->lchild; //重接q的右子树 } else { q->lchild = s->lchild; //重接q的左子树 } free(s); } } Status DeleteBST(BitTree& T, KeyType key) { //若排序二叉树T中存在关键字等于key的数据元素时,则删除该数据元素节点,并返回TRUE,否则返回FALSE if(!T) { return FALSE; } else { if EQ(key, T->data.key) { Delete(T); } else if LT(key, T->data.key) { DeleteBST(T->lchild, key); } else { DeleteBST(T->rchild, key); } return TRUE; } } int main() { BitTree dt, p = NULL; int i, j; int nn; int n = 10; ElemType r[10] = {{4, 8}, {16, 22}, {7, 3}, {78, 21}, {37, 5}, {24, 6}, {100, 71}, {61, 12}, {90, 9}, {79, 11}}; InitDSTable(dt); for(i = 0; i < n; i++) { InsertBST(dt, r[i]); } cout << "the Binary Tree is "; TraverseDSTable(dt); cout << endl; cin >> nn; cout << "delect node:" << nn << " "; DeleteBST(dt, 24); cout << "the Binary Tree is "; TraverseDSTable(dt); return 0; }