树与二叉树的应用
一、二叉查找树
1、二叉查找树的类型定义
//二叉查找树的类型定义 typedef int DataType; //结点关键码的数据类型 typedef struct node { DataType data; //结点的数据值 struct node * lchild, *rchild; //指向左、右子女结点的指针 }BSTNode, *BSTree;
2、二叉查找树的相关操作
//二叉查找树上的查找 BSTNode * Search (BSTree root, DataType x,BSTNode * & father) { BSTNode * P = root; father = NULL; //father是查找结点的父结点 while(p != NULL && p->data != x) //寻找包含x的结点 { father = p; //不等,向下层继续查找 if(x < p->data) //x小于根,向左子树继续查找 p = p->lchild; else p = p->rchild; //否则向右子树继续查找 } return p; } //二叉查找树的插入 int Insert (BSTree & root, DataType x) { BSTNode * s, * p, * f; p = Search (root,x,f); //寻找插入位置 if (p != NULL) return 0; //查找成功,不插入 s = new BSTNode; //否则,新结点插入 if(s == NULL) return 0; s->data = x; s->lchild = NULL; s->rchild = NULL; if(f == NULL) //空树,新结点为根结点 root = s; else if(x < f->data) //x小于f,作为左子女插入 f->lchild = s; else //否则,作为右子女插入 f->rchild = s; return 1; } //二叉查找树的删除 int Remove(BSTree & root, DataType x) { BSTNode * s, * p, * f; p = Search (root,x,f); //寻找删除的结点 if (p == NULL) return 0; //查找失败,不作删除 if(p->lchild != NULL && p->rchild != NULL) { s = p->lchild; //有双子女,找 *p的中序前趋 *s while(s->rchild != NULL) { f = s; s = s->rchild; } p->data = s->data; p = s; //用 *s的值取代 *p的值,再删 *s } if(p -> lchild != NULL) //左子树非空,记下左子女结点 s = p->lchild; //记下右子女结点 else s = p->rchild; if(p == root) //被删结点为根结点 root = s; else if(s->data < f->data) //父结点直接链接子女结点 f->lchild = s; else f->lchild = s; delete p; return 1; }
3、相关算法