天勤数据结构笔记——第六章 树与二叉树(代码)
二叉树的链式存储结构
typedef struct BTNode{char data;struct BTNode *lchild;struct BTNode *rchild;
}BTNode;
先序遍历
void preorder(BTNode *p){if(p!=NULL){visit(p);preorder(p->lchild);preorder(p->rchild);}
}
中序遍历
void preorder(BTNode *p){if(p!=NULL){preorder(p->lchild);visit(p);preorder(p->rchild);}
}
后序遍历
void preorder(BTNode *p){if(p!=NULL){preorder(p->lchild);preorder(p->rchild);visit(p);}
}
eg6-1 求出表达式的值
int comp(BTNode *p){int A,B;if(p!=NULL){if(p->lchild!=NULL && p->rchild!=NULL){A=comp(p->lchild);B=comp(p->rchild);return op(A,B,p->data);}else{return p->data-'0';}}else{return 0;}
}
eg6-2 求二叉树的深度
int getDepth(BTNode *p){int LD,RD;if(p!=NULL){LD=getDepth(p->lchild);RD=getDepth(p->rchild);return (LD>RD?LD:RD)+1;}else{return 0;}
}
eg6-3 按值查找
void search(BTNode *p,BTNode *&q,int key){if(p!=NULL){if(p->data==key){q=p;}else{search(p->lchild,q,key);if(q==NULL)search(p->rchild,q,key);}}
}
eg6-4 分别输出先序/中序/后续遍历的第k个值
int n=0;
//先序
void travel(BTNode *p,int k){if(p!=NULL){n++;if(k==n){cout<<p->data<<endl;return;} travel(p->lchild,k);travel(p->rchild,k);}
}
//中序
void travel(BTNode *p,int k){if(p!=NULL){travel(p->lchild,k);n++;if(k==n){cout<<p->data<<endl;return;} travel(p->rchild,k);}
}
//后序
void travel(BTNode *p,int k){if(p!=NULL){travel(p->lchild,k);travel(p->rchild,k);n++;if(k==n){cout<<p->data<<endl;return;}}
}
层次遍历
void level(BTNode *p){//初始化循环队列int front=rear=0;BTNode *que[maxSize];BTNode *q;//指向每次出队的结点if(p!=NULL){//根结点入队rear=(rear+1)%maxSize;que[rear]=p;//出队开始while(front!=rear){front=(front+1)%maxSize;q=que[front];visit(q);if(q->lchild!=NULL){rear=(rear+1)%maxSize;que[rear]=p->lchild;}if(q->rchild!=NULL){rear=(rear+1)%maxSize;que[rear]=p->rchild;}}}
}
eg6-5 求二叉树宽度
}BTNode;
typedef struct{BTNode *p;int lno;
}St;
int getWidth(BTNode *b){St que[maxSize];int front=rear=0;BTNode *q;int par_no;//层次遍历二叉树,给每个结点赋层号if(b!=NULL){++rear;que[rear].p=b;que[rear].lno=1;while(front!=rear){front++;q=que[front].p;par_no=que[front].lno;if(q->lchild!=NULL){rear++;que[rear].p=q->lchild;que[rear].lno=par_no+1;}if(q->rchild!=NULL){rear++;que[rear].p=q->rchild;que[rear].lno=par_no+1;}}//最后par_no保留的是最大(后)一层的层号int max=0,n;for(int i=0;i<par_no;i++){//查找每一层n=0;if(int j=1;j<=rear;++j){if(que[j].lno==i) n++;if(max<n) max=n;}}return max;}else{return 0;//空树}
}
先序遍历的非递归算法
void preorderNonrecursion(BTNode *bt){if(bt!=NULL){BTNode *Stack[maxSize];int top=-1;Stack[++top]=bt;BTNode *p;while(top!=-1){p=Stack[top--];visit(p);if(p->rchild!=NULL){Stack[++top]=p->rchild;}if(p->lchild!=NULL){Stack[++top]=p->lchild;}}}
}
中序遍历的非递归算法
void inorderNonrecursion(BTNode *bt){if(bt!=NULL){BTNode *Stack[maxSize];int top=-1;BTNode *p=bt;while(top!=-1||p!=NULL){//左孩子存在则入栈while(p->lchild!=NULL){Stack[++top]=p;p=p->lchild;}//左孩子没了就输出,找右孩子if(top!=-1){p=Stack[top--];visit(p);p=p->rchild;}}}
}
后序遍历的非递归算法
void posorderNonrecursion(BTNode *bt){if(bt!=NULL){BTNode *Stack1[maxSize];int top1=-1;BTNode *Stack2[maxSize];int top2=-1;Stack1[++top1]=bt;BTNode *p=NULL;while(top1!=-1){p=Stack1[top1--];Stack2[++top2]=p;if(p->lchild!=NULL){Stack1[++top1]=p->lchild;}if(p->rchild!=NULL){Stack1[++top1]=p->rchild;}}while(top2!=-1){p=Stack2[top2--];visit(p);}}
}
中序线索化
void InThread(TBTNode *p, TBTNode *&pre){if(p!=NULL){InThread(p->lchild,pre);if(p->lchild==NULL){p->lchild=pre;p->ltag=1;}if(pre!=NULL&&pre->lchild==NULL){pre->rchild=p;pre->rtag=1;}pre=p;InThread(p->rchild,pre);}
}
遍历中序线索二叉树
//第一个
TBTNode *First(TBTNode *p){while(p->ltag==0){p=p->lchild;}
}
//下一个
TBTNode *Next(TBTNode *p){if(p->rtag==0)return First(p->rchild);elsereturn p->rchild;
}
//打印整个中序序列
TBTNode Inorder(TBTNode *root){for(TBTNode *p=First(root);p!=NULL;p=Next(p)){visit(p);}
}
前序线索化
void preThread(TBTNode *p, TBTNode *&pre){if(p!=NULL){if(p->lchild==NULL){p->lchild=pre;p->ltag=1;}if(pre!=NULL&&pre->lchild==NULL){pre->rchild=p;pre->rtag=1;}pre=p;if(p->ltag==0)InThread(p->lchild,pre);if(p->rtag==0)InThread(p->rchild,pre);}
}
遍历前序线索二叉树
void preorder(TBTNode *root){if(root!=NULL){TBTNode *p=root;while(p!=NULL){while(p->ltag==0){visit(p);p=p->lchild;}visit(p);p=p->rchild;}}
}
后序线索化
void posThread(TBTNode *p, TBTNode *&pre){if(p!=NULL){InThread(p->lchild,pre);InThread(p->rchild,pre);if(p->lchild==NULL){p->lchild=pre;p->ltag=1;}if(pre!=NULL&&pre->lchild==NULL){pre->rchild=p;pre->rtag=1;}pre=p;}
}
天勤数据结构笔记——第六章 树与二叉树(代码)相关推荐
- 天勤数据结构笔记——第六章 树与二叉树(大题)
1.基础题 (1)略 (2)采用层次遍历,visit(q); 改为 count++; void level(BTNode *p,int &count){count=0;int front=re ...
- 考研数据结构笔记——第五章 树和二叉树
文章目录: 一:二叉树 1.性质 2.二叉树的存储结构 2.1 二叉树顺序存储 2.2 二叉树链式存储
- 数据结构思维 第六章 树的遍历
第六章 树的遍历 原文:Chapter 6 Tree traversal 译者:飞龙 协议:CC BY-NC-SA 4.0 自豪地采用谷歌翻译 本章将介绍一个 Web 搜索引擎,我们将在本书其余部分开 ...
- 《大话数据结构》第六章 树
文章目录 第六章 树 树的定义 结点的分类 树的抽象数据类型 树的存储结构 双亲表示法 孩子表示法 孩子兄弟表示法 二叉树 特殊二叉树 斜树 满二叉树 完全二叉树 二叉树的性质 二叉树的存储结构 遍历 ...
- 408数据结构考研笔记——第五章树与二叉树(重点)
目录 一.基本概念 1.定义 2.基本术语 3.性质(重点!!) 二.二叉树 1.定义 2.特殊二叉树 1.满二叉树 2.完全二叉树 3.二叉排序树 4.平衡二叉树 3.性质 4.存储结构 1.顺序存 ...
- 数据结构笔记 第六章 查找技术
查找技术 在计算机科学中定义为:在一些(有序的/无序的)数据元素中,通过一定的方法找出与给定关键字相同的数据元素的过程叫做查找.也就是根据给定的某个值,在查找表中确定一个关键字等于给定值的记录或数据元 ...
- 2022天勤考研数据结构笔记 第3章 栈和队列
2022天勤考研数据结构笔记 第3章 栈和队列(更新中) 第3章 栈和队列 3.1 结构体定义 3.2 顺序栈 3.3 链栈 3.4 栈的应用 3.5 顺序队 3.6 链队 第3章 栈和队列 栈和队列 ...
- 2022天勤考研数据结构笔记 第2章 线性表
2022天勤考研数据结构笔记 第2章 线性表(更新中) 第2章 线性表 2.1 结构体定义 2.2 顺序表 2.3 单链表 2.4 双链表 2.5 循环链表 2.6 逆置问题(408重要考点) 第2章 ...
- 深入理解 C 指针阅读笔记 -- 第六章
Chapter6.h #ifndef __CHAPTER_6_ #define __CHAPTER_6_/*<深入理解C指针>学习笔记 -- 第六章*/typedef struct __p ...
最新文章
- DEDECMS 安全优化
- [OS复习]进程管理5
- GridView行号大集合
- 全排列—leetcode46
- Vue学习笔记(八) 组件进阶
- java for循环 嵌套for循环-标签使用
- Leetcode每日一题:28.implement-strstr(实现strStr())
- php手机网站支付宝_PHP实现支付宝手机网站支付功能
- 关于5G你所需要知道的一切
- 初识Jasima-Jasima中的建模对象
- dcs world f15c教学_开源声码器WORLD在语音合成中的应用
- 华为星环大数据_星环大数据平台介绍,盘点星环大数据和华为大数据
- 三层交换机和vrrp协议
- MCGS实现按键按一次按下,再按一次弹起
- Luogu 1880 合并石子
- 秀米svg点击显示另一张图_公众号排版怎么做?点击图片出现另一张图片是怎么弄的?...
- 51单片机的堆栈指针(SP)
- 基于《狂神说Java》JUC并发编程--学习笔记
- matlab实现聚类分析
- 驱动级的特征码修改——终级免杀之PcShare
热门文章
- 天天生鲜项目从0开始
- 哪些书是技术人必看的?先推荐12本吧
- 给定一个字符串计算式,计算结果
- 网站被挂马植入webshell导致网站瘫痪案例
- 一文读懂LeNet、AlexNet、VGG、GoogleNet、ResNet到底是什么?
- ListView控件的作用以及使用方法
- 《算法图解》----第十章:K最邻近算法
- 论文写作--参考文献标注
- opencv 安装 opencv_contrib 出现的几个问题和解决方法
- SWAT模型 | 运行Arcswat报错问题及解决办法 | forrt1:error(65): floating invalid解决方法