二叉树的逻辑结构和遍历

  • 二叉树的顺序存储:
  • 二叉树的顺序存储的缺点:
  • 二叉树的链式存储(常):
    • 二叉树链式的代码定义:
    • 二叉树的遍历方法:
      • 先序遍历:
      • 中序遍历:
      • 后序遍历:
      • 层次遍历:
    • 遍历序列转二叉树:
      • 先序遍历序列+中序遍历序列:
      • 后序遍历序列+中序遍历序列:
      • 层次遍历序列+中序遍历序列:

二叉树的顺序存储:

前提: 是完全二叉树
问题: 用一块连续的存储单元(数组)存储节点元素,怎么才能体现树的逻辑结构呢(怎么体现1是23的双亲节点,23是1的孩子节点)?
答: 利用了完全二叉树的性质,可以通过数组下标找到某个节点的双亲节点或孩子节点。(2节点的孩子节点是数组下标为4和5的节点)
问题: 非完全二叉树怎么实现顺序存储呢?
答: 将非完全二叉树补成完全二叉树即可,将补上去的节点数组对应位置置0。

二叉树的顺序存储的缺点:

会浪费大量的存储空间,这种存储方式比较适合完全二叉树

二叉树的链式存储(常):


问题: 空指针域与非空指针域的关系

二叉树链式的代码定义:

typedef struct BiTNode{ElemType data;struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

二叉树的遍历方法:

先序遍历:


递归实现:

void PreOrder(BiTree T){if(T != NULL){visit(T);PreOrder(T->lchild);PreOrder(T->rchild);}
}

栈的实现:

中序遍历:


递归实现:

void InOrder(BiTree T){if(T != NULL){PreOrder(T->lchild);visit(T);PreOrder(T->rchild);}
}

栈的实现:

//初始时依次扫描根节点的所有左侧节点并入栈
//出栈一个节点,访问该节点
//扫描该节点的右孩子节点并入栈
//依次扫描右孩子节点的所有左侧节点并入栈
//反复该过程直到栈空为止
void InOrder(BiTree T){InitStack(S);BiTree p = T;while(p != NULL || IsEmpty(S)){if(p != NULL){Push(S,p);p = p->lchild;}else{Pop(S,p);visit(p);p = p->rchild;}}
}

后序遍历:


递归实现:

void PostOrder(BiTree T){if(T != NULL){PreOrder(T->lchild);PreOrder(T->rchild);visit(T);}
}

层次遍历:

//初始时将根入队并访问根节点,然后出队
//若有左子树,则将左子树的根入队
//若有右子树,则将右子树的根入队
//然后出队,访问该节点
//反复该过程直到队列空为止
void LevelOrder(BiTree T){InitQueue(Q);BiTree p;EnQueue(Q,T);while(!isEmpty(Q)){DeQueue(Q,p);visit(p);if(p->lchild != NULL)EnQueue(Q,p->lchild);if(p->rchild != NULL)EnQueue(Q,p->rchild);}
}

遍历序列转二叉树:

先序遍历序列+中序遍历序列:

后序遍历序列+中序遍历序列:

层次遍历序列+中序遍历序列:

ps: 后序遍历序列+前序遍历序列不能唯一确定一颗二叉树

数据结构之二叉树的逻辑结构和遍历相关推荐

  1. 【数据结构】二叉树的存储和遍历

    二叉树的存储结构 顺序存储结构 二叉树的顺序存储结构是指用一组地址连续的存储单元依次自上而下.从左到右存储完全二叉树上的结点,即将完全二叉树上编号为 i 的结点存储在数组下标为 i−1的数组分量中,然 ...

  2. 数据结构之 二叉树的存储和遍历总结

    关于二叉树的存储和遍历主要有一下几个知识点: 遍历的四种方法,建树的几种方法: 话不多说直接上代码: 因为是节省时间和节省空间我把他们合在了一起,此代码仅供参考,使用时要注意代码的正确性,也可以抓取想 ...

  3. 【数据结构】二叉树的非递归遍历

    非递归遍历二叉树 一.二叉树的前序遍历 二.二叉树的中序遍历 三.二叉树的后序遍历 3.1 方法一 3.2 方法二 一.二叉树的前序遍历 题目链接 我们可以把任何一棵树看成左路节点,左路节点和右子树. ...

  4. 数据结构 5-3-1 二叉树四种顺序遍历递归实现

    一.概念 二叉树的遍历是指按照某种搜索方式,得到一条路径,按照这个路径访问整个二叉树,树中的每个节点访问一次.根据当前节点的访问顺序分为先序.中序.后序访问,除此之外还有一种层序,总共四种访问方式. ...

  5. mysql 遍历二叉树_【自考】数据结构之二叉树遍历

    什么是数据结构? 首先看看维基百科的定义:在计算机科学或信息科学中, 数据结构 (英语:data structure)是计算机中存储.组织数据的方式.通常情况下,精心选择的数据结构可以带来最优效率的算 ...

  6. 算法与数据结构(三) 二叉树的遍历及其线索化(Swift版)

    前面两篇博客介绍了线性表的顺序存储与链式存储以及对应的操作,并且还聊了栈与队列的相关内容.本篇博客我们就继续聊数据结构的相关东西,并且所涉及的相关Demo依然使用面向对象语言Swift来表示.本篇博客 ...

  7. 数据结构之二叉树(遍历、建立、深度)

    数据结构之二叉树(遍历.建立.深度) 1.二叉树的深度遍历 二叉树的遍历是指从根结点出发,按照某种次序依次访问二叉树的所有结点,使得每个结点被访问一次且仅被访问一次. 对于二叉树的深度遍历,有前序遍历 ...

  8. 【关于封装的那些事】 缺失封装 【关于封装的那些事】 泄露的封装 【关于封装的那些事】 不充分的封装 【图解数据结构】二叉查找树 【图解数据结构】 二叉树遍历...

    [关于封装的那些事] 缺失封装 目录 - 缺失封装 为什么不能缺失封装? 缺失封装潜在的原因 未意识到关注点会不断变化 混合关注点 幼稚的设计决策 示例分析一 示例分析二 总结 缺失封装 没有将实现变 ...

  9. step3 . day7数据结构之二叉顺序数的创建和二叉树的栈形式遍历

    1.最近从网易云课堂学习了一个老师的数据结构相关的知识,了解到数据结构的应用和二分查找之间的关系,就自己想着写一个创建二叉顺序数和利用栈对二叉顺序树进行顺序输出的代码,终于一个周末的时间写完了. 2. ...

最新文章

  1. webvr动画函数requestAnimationFrame
  2. Apache认证、授权和访问控制
  3. OpenCV计算机视觉编程攻略之生成椒盐噪声实现
  4. git add .出现尚未暂存以备提交的变更
  5. 冻结拆分_还不会固定表头?速来围观Excel冻结窗格实战教程
  6. 获取连接无线路由客户机信息命令
  7. Win7 系统解压安装
  8. 万维网联盟:已完成对HTML5的规范开发
  9. Oracle的 IT 世界观
  10. Pvr_Controller
  11. video读取服务器本地的视频文件,javascript-video.js无法读取本地视频
  12. 【Proteus仿真】【51单片机】智能温控风扇设计
  13. Linux Socket学习(十二)
  14. 火影T5A笔记本系统损坏了无法进入桌面怎么办?
  15. 不被多数人知道但却超好的东东
  16. lua 区间比较_自然区间匹配算法 - borey的个人空间 - OSCHINA - 中文开源技术交流社区...
  17. java 聊天机器人 源码_Alice聊天机器人源码及DEMO - 源码下载|Windows编程|网络编程|源代码 - 源码中国...
  18. 深度学习Pytorch框架
  19. 华为模拟器eNSP练习题 - HCIA综合实验
  20. CSS(3)学习笔记——持续更新

热门文章

  1. 情人节,找个程序员当男朋友,一般都不会太差
  2. thinkpad卡在logo界面_四大系列 一个品牌,超好用的商务伴侣Thinkpad
  3. js json制表符报错_llhttp是如何使Node.js性能翻倍的?
  4. Advanced Science|北京大学第一医院肾脏内科杨莉团队与白凡研究组揭示急性肾损伤中始动和放大炎症巨噬细胞新亚群...
  5. 生信学习学的是什么?常识!
  6. 修复MacBook Touch Bar(触控栏)无法正常工作的方法
  7. java中选择排序和冒泡排序_Java选择排序就是比冒泡排序牛「具体详情,请看此文」...
  8. 迁移分支_资料 | 迁移学习简明手册
  9. 1.4 编程基础之逻辑表达式与条件分支
  10. pythonsocket自动化教程_Python 的 Socket 编程教程