数据结构笔记(3)树——二叉查找树
来源:互联网 发布:四川理工学院知乎 编辑:程序博客网 时间:2024/05/29 11:31
树
- 定义: 一颗树是一些节点的结合,这个集合可以是空集,若非空,则一棵树由称为(root)的根节点与0个或多个非空的子树组成。一棵树由N个节点与N-1条边构成。
- 深度:从根到n的唯一路径的长度,根的深度为0。
- 高度:从n到一片树叶最长路径的长,叶的高度为0。
父子兄弟树
typedef struct TreeNode *PtrToNode;typedef struct treeNode{//父子兄弟树 int element;//数据域 PtrToNode firstChild;//长子 PtrToNode nextSibling;//下一个兄弟姐妹} TreeNode;
遍历方式
- 先序遍历(preorder traversal): 先输出根节点,然后遍历左子树,最后遍历右子树。
- 中序遍历(inorder traversal): 先遍历左子树,再输出根节点,最后遍历右子树(在特定情况下的二叉查找树通过该遍历方式可以顺序输出整个树)。
- 后序遍历(postorder traversal): 先遍历左子树,再遍历右子树,最后遍历根。
则图示的数按照:
1. 先序遍历:10 5 8 6 15 12 11 22
2. 中序遍历:5 6 8 10 11 12 15 22
3. 后序遍历:6 8 5 11 12 22 15 10
二叉树:
- 每个节点都不能有多于两个的儿子。
- 实现:
struct binTreeNode{ int element; struct binTreeNode *left;//左子树 struct binTreeNode *right;//右子树};
利用栈与二叉树实现表达式树:
(略)
二叉树的子集:二叉查找树
- 性质:对于树中的每个节点X,它的左子树中所有关键值小于X的关键字值,它的右子树中所有关键字值大于X的关键字值。
- 游标(数组)实现:
typedef struct tREE{ int data; int left; int right;} TREE;//先序遍历、中序遍历、后序遍历void pre_order(int root);void mid_order(int root);void pos_order(int root);//查找key节点、查找最小节点int find(int key,int root);int findMin(int root);//插入X(作为数组引用标签)int insert(int X,int root);//删除X(作为数组引用标签)int delete(int X,int root);void pre_order(int root){ if(root<0); else { printf("%d ",tr[root].data); pre_order(tr[root].left); pre_order(tr[root].right); }}void mid_order(int root){ if(root<0); else { mid_order(tr[root].left); printf("%d ",tr[root].data); mid_order(tr[root].right); }}void pos_order(int root){ if(root<0); else { pos_order(tr[root].left); pos_order(tr[root].right); printf("%d ",tr[root].data); }}int find(int key,int root){ if(root<0) return -1; else { if(key<tr[root].data) root=find(key,tr[root].left); else if(key>tr[root].data) root=find(key,tr[root].right); return root; }}int findMin(int root){ if(tr[root].left<0) return root; else return findMin(tr[root].left);}int insert(int x,int root){ if(root<0) return x; else { if(tr[x].data<tr[root].data) tr[root].left=insert(x,tr[root].left); else if(tr[x].data>tr[root].data) tr[root].right=insert(x,tr[root].right); return root; }}int delete(int x,int root){ int Tmp; if(root<0) return -1; else if(tr[x].data>tr[root].data) tr[root].right=delete(x,tr[root].right); else if(tr[x].data<tr[root].data) tr[root].left=delete(x,tr[root].left); else if(tr[root].left>0&&tr[root].right>0) {//if the leaf to be deleted has children Tmp=findMin(tr[root].right); tr[root].data=tr[Tmp].data; tr[root].right=delete(tr[root].data,tr[root].right); } else if(tr[root].left>0) return tr[root].left; else return tr[root].right; return root;}
- 实现(链表):
struct binTreeNode{ int element; struct binTreeNode *left;//左子树 struct binTreeNode *right;//右子树};/** * 二叉查找树性质:对于树中的每个节点X,它的左子树中所有关键值小于X的关键字值,它的右子树中所有关键字值大于X的关键字值 */struct binTreeNode;typedef struct binTreeNode* Position;typedef struct binTreeNode* SearchTree;SearchTree MakeEmpty(SearchTree T);Position Find(int X,SearchTree T);Position FindFather(int X,SearchTree T);Position FindMin(SearchTree T);Position FindMax(SearchTree T);SearchTree Insert(int X,SearchTree T);SearchTree Delete(int X,SearchTree T);int Retrieve(Position P);SearchTree MakeEmpty(SearchTree T){ if(T!=NULL) { MakeEmpty(T->left); MakeEmpty(T->right); free(T); } return NULL;}Position Find(int X,SearchTree T){ if(T==NULL) return NULL; if(X<T->element) return Find(X,T->left); else if(X>T->element) return Find(X,T->right); else return T;}Position FindFather(int X,SearchTree T){}Position FindMax(SearchTree T){//递归写法 if(T==NULL) return NULL; if(T->right==NULL) return T; else return FindMax(T->right);}Position FindMin(SearchTree T){//迭代写法 if(T!=NULL) while(T->left!=NULL) T=T->left; return T;}SearchTree Insert(int X,SearchTree T){ if(T==NULL) {//此处注意:malloc()分配空间时所传递的sizeof()内应为结构体struct binTreeNode 而非指针SearchTree。 //T = (binTreeNode*)(malloc(sizeof(struct binTreeNode))); //T=(SearchTree)malloc(sizeof(SearchTree)); T=malloc(sizeof(struct binTreeNode)); // T=malloc(sizeof()) if(T==NULL) __mingw_printf("Out of Space"); //头文件.h写法,可改成printf(); else { T->element=X; T->left=T->right=NULL; } } else if(X<T->element) T->left=Insert(X,T->left); else if(X>T->element) T->right=Insert(X,T->right); return T;}SearchTree Delete(int X,SearchTree T){ Position TmpCell; if(T==NULL) { __mingw_printf("Element not found"); return NULL; } else if(X<T->element) T->left=Delete(X,T->left); else if(X>T->element) T->right=Delete(X,T->right); else if(T->left&&T->right) { TmpCell=FindMin(T->right); T->element=TmpCell->element; T->right=Delete(T->element,T->right); } else { TmpCell=T; if(T->left==NULL) T=T->right; else if(T->right==NULL) T=T->left; free(TmpCell); } return T;}
阅读全文
1 0
- 数据结构笔记(3)树——二叉查找树
- 数据结构——二叉(查找)树
- 数据结构之查找(五)——二叉查找树
- 数据结构——二叉查找树
- 基本数据结构——二叉查找树
- 数据结构专题——二叉查找树
- 数据结构(Java)——二叉查找树
- 数据结构——二叉查找树
- 图解数据结构(7)——二叉查找树及平衡二叉查找树
- 图解数据结构(7)——二叉查找树及平衡二叉查找树
- 数据结构(6)——二叉查找树及平衡二叉查找树
- 图解数据结构(7)——二叉查找树及平衡二叉查找树
- 图解数据结构(7)——二叉查找树及平衡二叉查找树
- (数据结构笔记)二叉查找树的实现
- 数据结构学习笔记(二):二叉查找树
- 数据结构——二叉查找树(C语言)
- 数据结构学习——二叉查找树ADT(程序化)
- java数据结构——AvlTree(平衡二叉查找树)
- 数据结构笔记(2)线性表
- Nginx配置负载均衡
- javaweb获取客户用户的真实ip。
- web前端测试要点
- 360浏览器下实现图片上传及时刷新
- 数据结构笔记(3)树——二叉查找树
- 互联网协议演变之路
- Ext 留住this
- ireport 属性大全
- POJ3623 Best Cow Line, Gold 【后缀数组】
- Jenkins定时构建任务
- 人工智能视频课程网盘下载
- Go命令行工具
- 唯快不破:结合内核实现源码分析 select poll epoll区别