二叉树的链式存储结构

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.基础题 (1)略 (2)采用层次遍历,visit(q); 改为 count++; void level(BTNode *p,int &count){count=0;int front=re ...

  2. 考研数据结构笔记——第五章 树和二叉树

    文章目录: 一:二叉树 1.性质 2.二叉树的存储结构 2.1 二叉树顺序存储 2.2 二叉树链式存储

  3. 数据结构思维 第六章 树的遍历

    第六章 树的遍历 原文:Chapter 6 Tree traversal 译者:飞龙 协议:CC BY-NC-SA 4.0 自豪地采用谷歌翻译 本章将介绍一个 Web 搜索引擎,我们将在本书其余部分开 ...

  4. 《大话数据结构》第六章 树

    文章目录 第六章 树 树的定义 结点的分类 树的抽象数据类型 树的存储结构 双亲表示法 孩子表示法 孩子兄弟表示法 二叉树 特殊二叉树 斜树 满二叉树 完全二叉树 二叉树的性质 二叉树的存储结构 遍历 ...

  5. 408数据结构考研笔记——第五章树与二叉树(重点)

    目录 一.基本概念 1.定义 2.基本术语 3.性质(重点!!) 二.二叉树 1.定义 2.特殊二叉树 1.满二叉树 2.完全二叉树 3.二叉排序树 4.平衡二叉树 3.性质 4.存储结构 1.顺序存 ...

  6. 数据结构笔记 第六章 查找技术

    查找技术 在计算机科学中定义为:在一些(有序的/无序的)数据元素中,通过一定的方法找出与给定关键字相同的数据元素的过程叫做查找.也就是根据给定的某个值,在查找表中确定一个关键字等于给定值的记录或数据元 ...

  7. 2022天勤考研数据结构笔记 第3章 栈和队列

    2022天勤考研数据结构笔记 第3章 栈和队列(更新中) 第3章 栈和队列 3.1 结构体定义 3.2 顺序栈 3.3 链栈 3.4 栈的应用 3.5 顺序队 3.6 链队 第3章 栈和队列 栈和队列 ...

  8. 2022天勤考研数据结构笔记 第2章 线性表

    2022天勤考研数据结构笔记 第2章 线性表(更新中) 第2章 线性表 2.1 结构体定义 2.2 顺序表 2.3 单链表 2.4 双链表 2.5 循环链表 2.6 逆置问题(408重要考点) 第2章 ...

  9. 深入理解 C 指针阅读笔记 -- 第六章

    Chapter6.h #ifndef __CHAPTER_6_ #define __CHAPTER_6_/*<深入理解C指针>学习笔记 -- 第六章*/typedef struct __p ...

最新文章

  1. DEDECMS 安全优化
  2. [OS复习]进程管理5
  3. GridView行号大集合
  4. 全排列—leetcode46
  5. Vue学习笔记(八) 组件进阶
  6. java for循环 嵌套for循环-标签使用
  7. Leetcode每日一题:28.implement-strstr(实现strStr())
  8. php手机网站支付宝_PHP实现支付宝手机网站支付功能
  9. 关于5G你所需要知道的一切
  10. 初识Jasima-Jasima中的建模对象
  11. dcs world f15c教学_开源声码器WORLD在语音合成中的应用
  12. 华为星环大数据_星环大数据平台介绍,盘点星环大数据和华为大数据
  13. 三层交换机和vrrp协议
  14. MCGS实现按键按一次按下,再按一次弹起
  15. Luogu 1880 合并石子
  16. 秀米svg点击显示另一张图_公众号排版怎么做?点击图片出现另一张图片是怎么弄的?...
  17. 51单片机的堆栈指针(SP)
  18. 基于《狂神说Java》JUC并发编程--学习笔记
  19. matlab实现聚类分析
  20. 驱动级的特征码修改——终级免杀之PcShare

热门文章

  1. 天天生鲜项目从0开始
  2. 哪些书是技术人必看的?先推荐12本吧
  3. 给定一个字符串计算式,计算结果
  4. 网站被挂马植入webshell导致网站瘫痪案例
  5. 一文读懂LeNet、AlexNet、VGG、GoogleNet、ResNet到底是什么?
  6. ListView控件的作用以及使用方法
  7. 《算法图解》----第十章:K最邻近算法
  8. 论文写作--参考文献标注
  9. opencv 安装 opencv_contrib 出现的几个问题和解决方法
  10. SWAT模型 | 运行Arcswat报错问题及解决办法 | forrt1:error(65): floating invalid解决方法