【递归遍历】

以二叉链表的存储结构为例

1.先序遍历

若二叉树为空,则空操作,否则:先访问根结点,再先序遍历左子树,然后先序遍历右子树

void preOrder(Node *bt){//先序遍历根结点为bt的二叉树的递归算法if(bt==NULL)return;else{cout<<bt->data;//输出根节点bt的数据域preOrder(bt->lchild);//前序遍历bt的左子树preOrder(bt->rchild);//前序遍历bt的右子树}
}

2.中序遍历

若二叉树为空,则空操作,否则:先中序遍历左子树,再访问根结点,然后中序遍历右子树

void inOrder(Node *bt){//中序遍历根结点为bt的二叉树的递归算法if(bt==NULL)return;else{inOrder(bt->lchild);//中序遍历bt的左子树cout<<bt->data;//输出根节点bt的数据域inOrder(bt->rchild);//中序遍历bt的右子树}
}

3.后序遍历

若二叉树为空,则空操作,否则:先后序遍历左子树,再后序遍历右子树,然后访问根结点

void postOrder(Node *bt){//后序遍历根结点为bt的二叉树的递归算法if(bt==NULL)return;else{postOrder(bt->lchild);//后序遍历bt的左子树postOrder(bt->rchild);//后序遍历bt的右子树cout<<bt->data;//输出根结点bt的数据域}
}

4.层序遍历

从根结点开始,首先将根结点入队,然后从队首取出一个元素,访问该指针所指的结点,若该指针所指的结点左、右孩子非空,则将其左孩子指针、右孩子指针入队,重复上述操作,直至队列为空。

void levelOrder(Node *root){queue<Node *> Q;if(root)Q.push(root);while(!Q.empty()){root=Q.front();//取队列首结点Q.pop();cout<<root->data;//访问当前结点if(root->lchild)//左子树进队列Q.push(root->lchild);if(root->rchild) //右子树进队列Q.push(root->rchild);   }
}

【非递归遍历】

以二叉链表的存储结构为例

1.先序遍历

借助栈,遇到一个结点,就访问该结点,并把此结点推入栈中,然后遍历它的左子树,遍历完它的左子树后,从栈顶托出这个结点,并按照它的右链接指示的地址再去遍历该结点的右子树结构。

void preOrder(Node *root) {stack<Node *>  s;while(root!=NULL || !s.empty()) {while (root!= NULL){cout<<root->data;s.push(root);root=root->lchild;}if(!s.empty()) {root=s.pop();root=root->rchild;}}
}

2.中序遍历

借助栈,遇到一个结点,就把它推入栈中,并去遍历它的左子树,遍历完左子树后,从栈顶托出这个结点并访问之,然后按照它的右链接指示的地址再去遍历该结点的右子树。

void inOrder(Node *root){stack<Node * > s;while(root!=NULL || !s.empty()) {while(root!=NULL){s.push(root);root=root->lchild;}if(!s.empty()) {root=s.top();s.pop();cout<<root->data;root=root->rchild;}}
}

3.后序遍历

借助栈,遇到一个结点,把它推入栈中,遍历它的左子树,左子树遍历结束后,还不能马上访问处于栈顶的该结点,而是要再按照它的右链接结构指示的地址去遍历该结点的右子树,遍历遍右子树后才能从栈顶托出该结点并访问。

void postOrder(Node *root) {stack<Node *> s;Node *cur,*pre=NULL;if(root==NULL)return;s.push(root);while (!s.empty()) {cur=s.top();if ((cur->lchild==NULL&&cur->rchild==NULL)||(pre!=NULL&&(pre==cur->lchild||pre==cur->rchild))) {cout<<cur->data;s.pop();pre=cur;}else {if (cur->rchild!=NULL)s.push(cur->rchild);if (cur->lchild!=NULL)s.push(cur->lchild);}}
}

理论基础 —— 二叉树 —— 二叉树的遍历相关推荐

  1. 代码随想录day13|二叉树理论基础、二叉树的递归遍历、二叉树的迭代遍历

    二叉树理论基础 这边需要重点注意的是二叉树的链式节点的定义 struct TreeNode(){int val;TreeNode *left;TreeNode *right;TreeNode(int ...

  2. 关于二叉树的层次遍历的花样(c++实现)

    花样变形1::二叉树层次遍历但是分层打印 分析:与普通打印多了一个分层打印,其实只要在在层次遍历中多设置一个标记变量即可 代码如下: //二叉树的层次遍历 void levelTravel(BTNod ...

  3. python二叉树遍历算法_分享python实现的二叉树定义与遍历

    这篇文章主要介绍了python实现的二叉树定义与遍历算法,结合具体实例形式分析了基于Python定义的二叉树及其常用遍历操作实现技巧,需要的朋友可以参考下 本文实例讲述了python实现的二叉树定义与 ...

  4. leetcode-102 二叉树的层次遍历

    给定一个二叉树,返回其按层次遍历的节点值. (即逐层地,从左到右访问所有节点). 例如: 给定二叉树: [3,9,20,null,null,15,7] 3 / \ 9 20 / \ 15 7 返回其层 ...

  5. 二叉树的层次遍历 II

    给出一棵二叉树,返回其节点值从底向上的层次序遍历(按从叶节点所在层到根节点所在的层遍历,然后逐层从左往右遍历) 样例 给出一棵二叉树 {3,9,20,#,#,15,7}, 3/ \9 20/ \15 ...

  6. LeetCode:144_Binary Tree Preorder Traversal | 二叉树的前序遍历 | Medium

    题目:Binary Tree Preorder Traversal 二叉树的前序遍历,同样使用栈来解,代码如下: 1 struct TreeNode { 2 int val; 3 TreeNode* ...

  7. 根据二叉树的前序遍历和中序遍历重建二叉树

    题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7, ...

  8. 刻意练习:LeetCode实战 -- 二叉树的前序遍历

    背景 今天,第二期基础算法(Leetcode)刻意练习训练营 的打卡任务是二叉树的中序遍历,由于二叉树的遍历方式通常来说有四种:前序遍历.中序遍历.后序遍历以及层次遍历,而LeetCode也有二叉树的 ...

  9. 【每日一算法】二叉树的层次遍历 II

    每日一算法-二叉树的层次遍历 II 题目 给定一个二叉树,返回其节点值自底向上的层次遍历. (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历) 例如: 给定二叉树 [3,9,20,null,n ...

  10. 二叉树的层序遍历 II

    二叉树的层序遍历 II 给定一个二叉树,返回其节点值自底向上的层序遍历. (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历) 例如: 给定二叉树 [3,9,20,null,null,15,7] ...

最新文章

  1. GTX1080 LetNet-5 CPU GPU cuDNN5.1 时间对比
  2. Java 动态代理原理
  3. 计算机组成原理(哈工大刘宏伟)135讲(二)
  4. oracle 存储怎么使用,Oracle存储过程中如何使用数组(附范例)
  5. 在宽字节环境下获取EditBox中的CString转换为char[]
  6. qt 快速按行读取文件_这是知识点之Linux下分割文件并保留文件头
  7. LeetCode 323. 无向图中连通分量的数目(并查集)
  8. 纯Java代码 图片压缩
  9. idea在Sonar中点击exclude后恢复
  10. python时间序列预测不连续怎么办_用Python处理非平稳时间序列攻略
  11. python程序设计语言中的小于等于号_Python(matplotlib)小于或等于tex中的符号
  12. opencv-图像翻转问题
  13. Gmail服务器拒绝发送邮件,向Gmail发送邮件被退信,其他均正常,请协助,谢谢大家...
  14. 微信小程序 -对应的服务器证书无效
  15. VS开发Application生硬古怪的问题及原因汇总
  16. python中多行注释可以嵌套单行注释吗_Python单行注释与多行注释
  17. Python 爬虫实战(1):分析豆瓣中最新电影的影评并制作词云
  18. git 修改远端 commit 信息
  19. 目前什么ip软件比较好用,国内ip最多呢
  20. 手机版网课查询助手内置答案

热门文章

  1. CANOpen服务数据对象报文
  2. 猜数游戏c语言编程_做游戏,学编程(C语言) 10 僵尸危机
  3. 越老越值钱,除了程序员?
  4. 微信支付软件架构重构之旅
  5. Jeecg-Boot2.1.2 版本,手工集成Online在线开发模块(Online表单、Online报表)
  6. JEECG新版UI规划,主要提供H5方案(采用主流技术)
  7. 如何自定义 maven中的archetype
  8. JEECG 3.2版本发布,基于代码生成器的智能开发平台
  9. SpringBoot2.0 基础案例(04):定时任务和异步任务的使用方式
  10. haskell vscode下的环境搭配(包含各种坑的解决办法)