二叉排序树
来源:互联网 发布:淘宝计入最低价 编辑:程序博客网 时间:2024/05/29 19:17
二叉排序树
代码:
typedef struct BiTNode{ int data; struct BiTNode *lchild, *rchild;} BiTNode, *BiTree;
二叉排序树的查找操作
方法:
当二叉树不为空时,首先将给定值与根节点的关键字进行比较,若相等,则查找成功,否则根据给定值与根节点的关键字之间的
大小关系,在左子树或右子树上继续进行查找。
代码:
bool SearchBST(BiTree T, int key ){ if( !T ) { return false; } else { if( key == T->data ) { return true; } else if( key > T->data ) return SearchBST( T->rchild, key ); //在右子树继续查找 else return SearchBST( T->lchild, key ); //在左子树继续查找 }}二叉排序树的插入操作
方法:
对二叉树进行查找,当树中不存在该关键字时再进行插入。插入的结点一定是一个新添加的叶子结点,并且是查找不成功时查找路径上访问的最后
一个结点的左孩子或者右孩子。
代码:
bool SearchBST(BiTree T, int key, BiTree f, BiTree &res ){ /* 递归查找。其中,指针f指向T的双亲,其初始调用值为NULL 若查找成功,则指针res指向该数据元素节点,并返回TRUE; 若查找失败,则指针res指向查找路径上访问的最后一个节点,并返回FALSE */ if( !T ) { res = f; //这是f唯一被用到的位置。 return false; } else { if( key == T->data ) { res = T; return true; } else if( key > T->data ) return SearchBST( T->rchild, key, T, res ); //在右子树继续查找 else return SearchBST( T->lchild, key, T, res ); //在左子树继续查找 }}bool InsertBST( BiTree &T, int key ){ BiTree p, s; if( !SearchBST( T, key, NULL, p ) ) { s = (BiTree)malloc(sizeof(BiTNode)); s->data = key; s->lchild = s->rchild = NULL; if( !p ) T = s; //s为根节点,之前的树为空树 else if( key > p->data ) p->rchild = s; //s为右孩子 else p->lchild = s; //s为左孩子 return true; } return false;}
二叉排序树的删除操作
方法:
对二叉树进行删除时,首先在树中找到关键字等于给定值的结点,然后对该结点进行删除,根据被删除结点的情况进行如下:
1)如果被删除结点是叶子节点,那么直接删除即可
2)如果仅有左子树或右子树,那么上移子树即可
3)如果同时有左右子树,那么用删除节点的直接前驱或者直接后继来替换当前节点,并从二叉树中删除直接前驱或者直接后继
代码:
void Delete(BiTree &p){ BiTree q, s; if( !p->lchild && !p->rchild ) // p为叶子节点 p = NULL; else if( !p->lchild ) //左子树为空,只需重接右子树 { q = p; p = p->rchild; free(q); } else if( !p->rchild ) //右子树为空,只需重接左子树 { q = p; p = p->lchild; free(q); } else //左右子树均不为空 { q = p; s = p->lchild; while(s->rchild) //转左,然后向右走到尽头 { q = s; s = s->rchild; } p->data = s->data; if( q != p ) //判断是否执行上述while循环 q->rchild = s->lchild; //执行上述while循环,重接右子树 else q->lchild = s->lchild; //未执行上述while循环,重接左子树 free(s); }}void DeleteBST(BiTree &T, int key){ // 若二叉排序树T中存在关键字等于key的数据元素,则删除该数据元素节点 if(!T) //不存在关键字等于key的数据元素 return; else { if(key == T->data) Delete(T); else if( key < T->data) DeleteBST(T->lchild, key); else DeleteBST(T->rchild, key); }}
0 0
- 二叉排序树
- 二叉排序树
- 二叉排序树
- 二叉排序树
- 二叉排序树
- 二叉排序树
- 二叉排序树
- 二叉排序树
- 二叉排序树
- 二叉排序树
- 二叉排序树
- 二叉排序树
- 二叉排序树
- 二叉排序树
- 二叉排序树
- 二叉排序树
- 二叉排序树
- 二叉排序树
- Eclipse aidl 笔记
- 下载安卓源码流程
- [BZOJ]1069 最大土地面积
- 大数据
- 详解Java 8十大新特性
- 二叉排序树
- 用SearchGuard做elasticsearch的登录认证
- C++——继承
- doGet和doPost的区别
- linux select函数详解
- C++中的常量的基础知识
- 【jzoj3748】【CF446D】【DZY Loves Games】【矩阵乘法】
- Spring Security学习(一) Getting Started
- [BZOJ]1070 修车