二叉排序树的相关操作
2015-09-21 23:46
232 查看
二叉排序树
定义:
1)若它的左子树非空,则左子树的所有节点都小于它的根节点;
2)若它的右子树非空,则右子树的所有节点都小于它的根节点;
3)它的左右字数也分别为二叉排序树。
二叉排序树的创建和插入节点
代码实现
二叉排序树的节点删除
删除过程要记录删除节点(del)的父亲节点(pre),节点删除有4种情况
1)删除叶子节点,将父亲节点指向删除节点的指针置为NULL
2)删除节点只有左子树,父亲节点指向删除节点的指针指向删除节点的左孩子
3)删除节点只有右子树,父亲节点指向删除节点的指针指向删除节点的右孩子
4)删除节点既有左子树也有右子树,删除节点左子树的最大节点赋值给删除节
点,此时要删除子树的最大节点。
代码实现
定义:
1)若它的左子树非空,则左子树的所有节点都小于它的根节点;
2)若它的右子树非空,则右子树的所有节点都小于它的根节点;
3)它的左右字数也分别为二叉排序树。
二叉排序树的创建和插入节点
代码实现
int BST_Insert(TreeNode **root, int data) { if(NULL == *root){ (*root) = (TreeNode *)malloc(sizeof(TreeNode)); (*root)->data = data; (*root)->lchild = (*root)->rchild = NULL; return OK; } else if(data < (*root)->data) return BST_Insert(&(*root)->lchild,data); else if(data > (*root)->data) return BST_Insert(&(*root)->rchild,data); else return ERROR; } TreeNode *create_search_tree(int *arr, int size) { TreeNode *root; for(int i = 0; i < size; i++) BST_Insert(&root,arr[i]); return root; }
二叉排序树的节点删除
删除过程要记录删除节点(del)的父亲节点(pre),节点删除有4种情况
1)删除叶子节点,将父亲节点指向删除节点的指针置为NULL
2)删除节点只有左子树,父亲节点指向删除节点的指针指向删除节点的左孩子
3)删除节点只有右子树,父亲节点指向删除节点的指针指向删除节点的右孩子
4)删除节点既有左子树也有右子树,删除节点左子树的最大节点赋值给删除节
点,此时要删除子树的最大节点。
代码实现
int BST_Delete(TreeNode *root, int data) { if(NULL == root) return ERROR; TreeNode *pos = root,*pre = root; while(pos){ if(data < pos->data){ pre = pos; pos = pos->lchild; } else if(data > pos->data){ pos = pre; pos = pos->rchild; } else{ if(pos->lchild == NULL && pos->rchild == NULL){ if(pos == pre->lchild) //删除叶子节点 pre->lchild = NULL; else pre->rchild = NULL; free(pos); return OK; } else if(pos->rchild == NULL){ if(pre->lchild == pos) //删除节点只有左子树 pre->lchild = pos->lchild; else pre->rchild = pos->lchild; free(pos); return OK; } else if(pos->lchild == NULL){ if(pre->lchild == pos) //删除节点只有右子树 pre->lchild = pos->rchild; else pre->rchild = pos->rchild; free(pos); return OK; } else{ //删除节点既有左子树,又有右子树 TreeNode *del,*parent; parent = pos;//记录删除节点的父亲节点 del = pos->lchild;//记录删除节点 while(del->rchild){//找到pos删除节点左子树中最大的节点 parent = del; del = del->rchild; } pos->data = del->data;//pos节点左子树中最大节点赋值给pos节点 if(pos == parent)//pos节点左子数最大节点是子树的根节点 pos->lchild = del->lchild; else //parent节点的rchild指向del节点的左子树 parent->rchild = del->lchild; free(del); return OK; } } } return ERROR; }
相关文章推荐
- linux c 字符串处理API
- Android之JSON处理器FastJson
- 在UITextView上写入手机图库中的图片
- 计算器小程序
- Dota研发商起诉中清龙图 要求其停运刀塔传奇
- UVALIVE 4487 Exclusive-OR(加权并查集)
- QtQuick学习笔记(二)QML基本语法
- Qt安装与入门
- 什么是Servlet以及Servlet和JSP的关系是什么?
- WebView加载html实现网页上传本地文件(图片,拍照,语音等)
- Ret2Libc 练习(1) -- ZwSetInformationProcess
- Activity启动模式图文详解:standard, singleTop, singleTask 以及 singleInstance
- apue3 搭建(基于ubuntu 12.04LTS)
- Linux下QT中执行shell命令
- 2D 图像算法
- JSON格式序列化与反序列化(List、XML)
- c++课程后的感想与记录
- 菜鸟路之hibernate
- 【算法题目】包含min函数的栈
- 京东刘强东:中国互联网产业是巨大的泡沫