二叉树的递归遍历

代码随想客

前序遍历

class Solution {public://定义一个遍历函数void travel(TreeNode* cur,vector<int>& res){if(cur==nullptr){return ;}//前序就是中左右res.push_back(cur->val);travel(cur->left,res);travel(cur->right,res);}vector<int> preorderTraversal(TreeNode* root) {vector<int> res;travel(root,res);return res;    }
};

中序遍历

class Solution {public://定义一个遍历函数void travel(TreeNode* cur,vector<int>& res){if(cur==nullptr){return ;}//中序就是左中右travel(cur->left,res);res.push_back(cur->val);travel(cur->right,res);}vector<int> preorderTraversal(TreeNode* root) {vector<int> res;travel(root,res);return res;    }
};

后序遍历

class Solution {public://定义一个遍历函数void travel(TreeNode* cur,vector<int>& res){if(cur==nullptr){return ;}//后序就是左右中travel(cur->left,res);travel(cur->right,res);res.push_back(cur->val);}vector<int> preorderTraversal(TreeNode* root) {vector<int> res;travel(root,res);return res;    }
};

二叉树的迭代遍历

代码随想客

前序遍历(迭代法)

class Solution {public:vector<int> preorderTraversal(TreeNode* root) {stack<TreeNode*> st;vector<int> res;if(root==nullptr){return res;}st.push(root);while(!st.empty()){TreeNode* node=st.top();st.pop();res.push_back(node->val);if(node->right){st.push(node->right);}if(node->left){st.push(node->left);}}return res;}
};

中序遍历(迭代法)

class Solution {public:vector<int> inorderTraversal(TreeNode* root) {vector<int> res;stack<TreeNode*> st;if(root==nullptr){return res;}TreeNode* cur=root;while(cur!=nullptr||!st.empty()){if(cur!=nullptr){st.push(cur);cur=cur->left;}else{cur=st.top();res.push_back(st.top()->val);st.pop();cur=cur->right;}}return res;}
};

后序遍历(迭代法)

class Solution {public:vector<int> postorderTraversal(TreeNode* root) {vector<int> res;stack<TreeNode*> st;TreeNode* node;if(root==nullptr){return res;}st.push(root);while(!st.empty()){node=st.top();st.pop();res.push_back(node->val);if(node->left){st.push(node->left);}if(node->right){st.push(node->right);}}reverse(res.begin(),res.end());return res;}
};

二叉树的统一迭代遍历(看不懂也要背下来

代码随想客

统一迭代遍历基本结构如下

vector<int> res;
stack<TreeNode*> st;
//首先判断根节点是否为空,非空则压入st
if(root!=nullptr)
{st.push(root);
}
//然后就是主结构
while(!st.empty())
{TreeNode* node=root;if(node!=nullptr){st.pop();  //首先先弹出,避免重复操作//前序就是反过来:右左中,且每次到中就加一个nullptr//中序就是反过来:右中左,且每次到中就加一个nullptr//后序就是反过来:中右左,且每次到中就加一个nullptr   }else{//这里上来就是一个pop(),弹掉空指针st.pop();//然后把top的指针指向的值push_back进resres.push_back(st.top->val);//然后再是一个pop()st.pop();}
}
//最后一个非常简单的return
return res;

前序遍历(统一迭代)

class Solution {public:vector<int> inorderTraversal(TreeNode* root) {vector<int> res;stack<TreeNode*> st;if(root!=nullptr){st.push(root);}while(!st.empty()){TreeNode* node=st.top();if(node!=nullptr){st.pop();if(node->right){st.push(node->right);}if(node->left){st.push(node->left);}st.push(node);st.push(nullptr);  //中节点被访问过,但是还没有处理,加入空节点作为标记}else//只有当遇到空节点是,才将下一节点放进res{st.pop();//弹掉空节点res.push_back(st.top()->val);st.pop();//用过后把它弹掉}}return res;}
};

中序遍历(统一迭代)

class Solution {public:vector<int> preorderTraversal(TreeNode* root) {vector<int> res;stack<TreeNode*> st;if(root!=nullptr){st.push(root);}while(!st.empty()){TreeNode* node=st.top();if(node!=nullptr){st.pop();if(node->right){st.push(node->right);// 右}st.push(node);          //  中st.push(nullptr);if(node->left){st.push(node->left);//  左}}else{st.pop();res.push_back(st.top()->val);st.pop();}}return res;}
};

后序遍历(统一迭代)

class Solution {public:vector<int> postorderTraversal(TreeNode* root) {vector<int> res;stack<TreeNode*> st;if(root!=nullptr){st.push(root);}while(!st.empty()){TreeNode* node=st.top();if(node!=nullptr){st.pop();st.push(node);//    中st.push(nullptr);if(node->right){st.push(node->right);// 右}if(node->left){st.push(node->left);//  左}}else{st.pop();res.push_back(st.top()->val);st.pop();}}return res;}
};

C++二叉树的 前中后序遍历(学C++必看必会)深度优先遍历详解相关推荐

  1. 数据结构之二叉树的前中后序遍历以及层序遍历

    学习目标:读完这篇博客搞定二叉树的前中后序以及层序遍历 首先:你应该明白什么是二叉树,下面这幅图就是一个完全二叉树 其实所谓的二叉树就是一个节点有小于等于二个分支的树,可以没有分支,可以有1条分支,可 ...

  2. 二叉树的前,中,后序遍历(思路分析) [Java][数据结构]

    二叉树的前,中,后序遍历(思路分析) 前序遍历: 先输出父节点, 再遍历左子树和右子树 中序遍历: 先遍历左子树, 再输出父节点,再遍历右子树 后序遍历: 先遍历左子树,再遍历右子树,最后输出父节点 ...

  3. Java二叉树的前中后序遍历

    Java二叉树的前中后序遍历 1.前序遍历 1.1前序遍历概念 1.2前序遍历习题 2.中序遍历 2.1中序遍历概念 2.2中序遍历习题 3.后续遍历 3.1后序遍历概念 3.2后序遍历习题 大家好, ...

  4. 深入理解二叉树的前中后序

    一.问题 二叉树的前中后序遍历到底是什么,仅仅是三个顺序不同的 List 吗?为什么多叉树没有中序遍历? 二.遍历框架 所谓二叉树遍历是按某种特定规则,依次对二叉树中的节点进行相应的操作,并且每个节点 ...

  5. 数据结构与算法(java):树-二叉树(二叉查找树(BST)、线索化二叉树、哈夫曼树、平衡二叉树【AVL】、二叉树的前中后序遍历)

    二叉树 1.定义 二叉树 就是度不超过2的树(每个结点最多只有两个子结点).如图 2.特殊二叉树 满二叉树 当二叉树的每一个层的结点树都达到最大值,则这个二叉树就是满二叉树. 完全二叉树 叶结点只能出 ...

  6. 二叉树的前中后序遍历之迭代法(非统一风格迭代方式)

    文章目录 前言 一.前序遍历(迭代法) 二.中序遍历(迭代法) 三.后序遍历(迭代法) 总结 前言 「递归的实现就是:每一次递归调用都会把函数的局部变量.参数值和返回地址等压入调用栈中」,然后递归返回 ...

  7. 二叉树的前中后序遍历(考试常考)

    二叉树遍历的概念 二叉树的遍历是按某种规则对二叉树的每个节点均只被访问一次,根据根节点访问位置的不同分为三种:先序遍历(根左右).中序遍历(左根右).后序遍历(左右根).         由于树是通过 ...

  8. 【数据结构】二叉树的前中后序遍历

    二叉树的三种遍历 1. 创建一棵简单的二叉树 1.1 二叉树结构体实现 1.2 创造一个二叉树结点的函数 1.3 手动创造一棵二叉树 2.为什么要遍历? 3.最重要的知识:由二叉树引出的子问题分析 4 ...

  9. 二叉树的前中后序递归和非递归遍历操作【代码】

    "遍历"是二叉树各种操作的基础,可以在遍历过程中对节点进行各种操作,如:求节点的双亲,求节点的孩子,判断节点的层次.当然,还有一些更重要的操作,例如,依据遍历序列建立二叉树,对建立 ...

  10. 二叉树的前中后序遍历之迭代法(统一风格迭代方式)

    一.前序遍历(迭代法)->右左中 前序遍历是中左右,每次先处理的是中间节点,那么先将根节点放入栈中,然后将右孩子加入栈,再加入左孩子. 为什么要先加入 右孩子,再加入左孩子呢?因为这样出栈的时候 ...

最新文章

  1. 《C++代码设计与重用》——1.2 重用的神话
  2. 推荐阅读20101115
  3. 矩阵乘法计算速度再次突破极限,我炼丹能更快了吗?| 哈佛、MIT
  4. 微信红包要哭了...给抢红包设计一个新交互
  5. 前端学习(2823):sitemap配置
  6. 信息学奥赛一本通 1145:字符串p型编码 | OpenJudge NOI 1.7 31:字符串p型编码
  7. 深入理解java虚拟机---JDK8-废弃永久代(PermGen)迎来元空间(Metaspace)(十二)
  8. SAP漏洞:为什么补丁没有发挥作用?
  9. centos配置虚拟主机
  10. JavaScript制作标准计算器
  11. 05 pandas变形
  12. 博瑞智能云音箱云喇叭API开发定时播报文档(2023-4-5)
  13. linux 对设备不适当的ioctl操作,似乎对设备的直接操作只有ioctl函数了
  14. 高通msm8953平台I2C分析
  15. 计算机二级试题aoa,计算机二级AOA理论题库
  16. 牛客2019湘潭大学程序竞赛
  17. 20幅程序员才能看懂的趣图,看到第三个我就忍不住哈哈哈哈哈!
  18. 一键开启/禁用以太网
  19. 移动硬盘里面的文件怎么恢复
  20. win10 Easy Sysprep 5.19封装失败

热门文章

  1. 2020ISSCC 基于SRAM的存内计算15.5阅读记录
  2. yolo算法python代码_python通过yolo算法识别图片中的对象
  3. 比色皿洗涤不干净会造成很大实验误差
  4. 基于内容推荐算法的java,协同过滤推荐算法Java-DEMO
  5. 关于原理图库和封装库设计(三)
  6. 北理工嵩天Python语言程序设计笔记
  7. 记一次网易云解锁灰色音乐代理异常
  8. 在excel上画交换机面板_如何在Excel中创建面板图
  9. Cisco Packet Tracer入门--三层交换机局域网搭建教程
  10. ORL、Yale等人脸数据库百度云链接