理论基础 —— 二叉树 —— 二叉树的遍历
【递归遍历】
以二叉链表的存储结构为例
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);}}
}
理论基础 —— 二叉树 —— 二叉树的遍历相关推荐
- 代码随想录day13|二叉树理论基础、二叉树的递归遍历、二叉树的迭代遍历
二叉树理论基础 这边需要重点注意的是二叉树的链式节点的定义 struct TreeNode(){int val;TreeNode *left;TreeNode *right;TreeNode(int ...
- 关于二叉树的层次遍历的花样(c++实现)
花样变形1::二叉树层次遍历但是分层打印 分析:与普通打印多了一个分层打印,其实只要在在层次遍历中多设置一个标记变量即可 代码如下: //二叉树的层次遍历 void levelTravel(BTNod ...
- python二叉树遍历算法_分享python实现的二叉树定义与遍历
这篇文章主要介绍了python实现的二叉树定义与遍历算法,结合具体实例形式分析了基于Python定义的二叉树及其常用遍历操作实现技巧,需要的朋友可以参考下 本文实例讲述了python实现的二叉树定义与 ...
- leetcode-102 二叉树的层次遍历
给定一个二叉树,返回其按层次遍历的节点值. (即逐层地,从左到右访问所有节点). 例如: 给定二叉树: [3,9,20,null,null,15,7] 3 / \ 9 20 / \ 15 7 返回其层 ...
- 二叉树的层次遍历 II
给出一棵二叉树,返回其节点值从底向上的层次序遍历(按从叶节点所在层到根节点所在的层遍历,然后逐层从左往右遍历) 样例 给出一棵二叉树 {3,9,20,#,#,15,7}, 3/ \9 20/ \15 ...
- LeetCode:144_Binary Tree Preorder Traversal | 二叉树的前序遍历 | Medium
题目:Binary Tree Preorder Traversal 二叉树的前序遍历,同样使用栈来解,代码如下: 1 struct TreeNode { 2 int val; 3 TreeNode* ...
- 根据二叉树的前序遍历和中序遍历重建二叉树
题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7, ...
- 刻意练习:LeetCode实战 -- 二叉树的前序遍历
背景 今天,第二期基础算法(Leetcode)刻意练习训练营 的打卡任务是二叉树的中序遍历,由于二叉树的遍历方式通常来说有四种:前序遍历.中序遍历.后序遍历以及层次遍历,而LeetCode也有二叉树的 ...
- 【每日一算法】二叉树的层次遍历 II
每日一算法-二叉树的层次遍历 II 题目 给定一个二叉树,返回其节点值自底向上的层次遍历. (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历) 例如: 给定二叉树 [3,9,20,null,n ...
- 二叉树的层序遍历 II
二叉树的层序遍历 II 给定一个二叉树,返回其节点值自底向上的层序遍历. (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历) 例如: 给定二叉树 [3,9,20,null,null,15,7] ...
最新文章
- GTX1080 LetNet-5 CPU GPU cuDNN5.1 时间对比
- Java 动态代理原理
- 计算机组成原理(哈工大刘宏伟)135讲(二)
- oracle 存储怎么使用,Oracle存储过程中如何使用数组(附范例)
- 在宽字节环境下获取EditBox中的CString转换为char[]
- qt 快速按行读取文件_这是知识点之Linux下分割文件并保留文件头
- LeetCode 323. 无向图中连通分量的数目(并查集)
- 纯Java代码 图片压缩
- idea在Sonar中点击exclude后恢复
- python时间序列预测不连续怎么办_用Python处理非平稳时间序列攻略
- python程序设计语言中的小于等于号_Python(matplotlib)小于或等于tex中的符号
- opencv-图像翻转问题
- Gmail服务器拒绝发送邮件,向Gmail发送邮件被退信,其他均正常,请协助,谢谢大家...
- 微信小程序 -对应的服务器证书无效
- VS开发Application生硬古怪的问题及原因汇总
- python中多行注释可以嵌套单行注释吗_Python单行注释与多行注释
- Python 爬虫实战(1):分析豆瓣中最新电影的影评并制作词云
- git 修改远端 commit 信息
- 目前什么ip软件比较好用,国内ip最多呢
- 手机版网课查询助手内置答案
热门文章
- CANOpen服务数据对象报文
- 猜数游戏c语言编程_做游戏,学编程(C语言) 10 僵尸危机
- 越老越值钱,除了程序员?
- 微信支付软件架构重构之旅
- Jeecg-Boot2.1.2 版本,手工集成Online在线开发模块(Online表单、Online报表)
- JEECG新版UI规划,主要提供H5方案(采用主流技术)
- 如何自定义 maven中的archetype
- JEECG 3.2版本发布,基于代码生成器的智能开发平台
- SpringBoot2.0 基础案例(04):定时任务和异步任务的使用方式
- haskell vscode下的环境搭配(包含各种坑的解决办法)