二叉树理论基础

这边需要重点注意的是二叉树的链式节点的定义

struct TreeNode(){int val;TreeNode *left;TreeNode *right;TreeNode(int x) : val(x) , left(NULL) , right(NULL){}
};

其中TreeNode(int x) : val(x) , left(NULL) , right(NULL){}是初始化列表的操作。

二叉树的递归遍历

递归遍历主要保证三要素:

1、确定递归函数的参数和返回值:在我们进行前中后需遍历的时候,我们需要传入二叉树的节点,又由于我们需要打印遍历节点的数值,因此我们也需要传入一个vector容器来存放我们的节点数值。void traversal(TreeNode *cur,vector<int>& vec)

2、确定终止条件:当我们节点为空的时候结束遍历。if(cur == NULL)

3、确定单层递归的逻辑:我们以前序遍历为例子,我们就可以写出vec.push_back(cur->val);

traversal(cur->left,vec),traversal(cur->right,vec)

class Solution {
public:void traversal(TreeNode* cur,vector<int>& vec){if(cur == NULL) return;traversal(cur->left,vec);vec.push_back(cur->val);traversal(cur->right,vec);}vector<int> inorderTraversal(TreeNode* root) {vector<int> result;traversal(root,result);return result;}
};

二叉树的迭代遍历

对于前序遍历来说,我们不使用递归的方法来遍历二叉树,我们将二叉树的节点都存入栈中,用vector数组来树放节点的数值。

class Solution {
public:vector<int> preorderTraversal(TreeNode* root) {stack<TreeNode*> st;//用栈来存储节点vector<int> result;//用数组来存储结果数据if(root == NULL) return result;st.push(root);//把根节点存入栈while(!st.empty()){TreeNode *node = st.top();//用一个指针指向栈的顶端st.pop();//弹出最顶端元素result.push_back(node->val);if(node->right) st.push(node->right);if(node->left) st.push(node->left);}return result;}
};

其实后序遍历的思想和前序遍历差不多,前序遍历是中左右,迭代遍历就是中右左。其实我们可以迭代遍历中左右,那么递归遍历就是中右左,最后我们反过来就是左右中,得到的就是后序遍历的结果。

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

中序遍历和前后序遍历是有些不同,因为中序遍历的时候第一个要处理的节点不是根节点,我们必须先处理最左边的节点,我们用一个cur指针遍历二叉树,我们首先将所有的左节点从根节点开始入栈,当cur指向空时候,我们就弹出的栈顶的元素,并将数值存入数组,这样就处理了中的操作,接下来让cur指向右节点,只要cur为空,就弹出栈中元素,最后当栈中没有元素了,就结束循环,一开始需要加一个cur!=NULL条件,不然从一开始就不进入循环了。

class Solution {
public:vector<int> inorderTraversal(TreeNode* root) {stack<TreeNode*> st;vector<int> result;TreeNode* cur = root;while(cur != NULL || !st.empty()){if(cur != NULL)//cur不为空的时候{st.push(cur);cur = cur->left;           //左}else//cur为空的时候,这时候需要弹出最外层的元素{cur = st.top();st.pop();result.push_back(cur->val);//中cur = cur->right;                //右}}   return result;}
};

代码随想录day13|二叉树理论基础、二叉树的递归遍历、二叉树的迭代遍历相关推荐

  1. 代码随想录算法训练营第十五天 | 102. 二叉树的层序遍历 | 226.翻转二叉树 | 101. 对称二叉树

    递归三部曲 确定递归函数的参数和返回值 确定终止条件 确定单层递归的逻辑 102. 二叉树的层序遍历 题解及想法 解法一 :递归法 class Solution {public List<Lis ...

  2. c语言二叉树最小值,C语言递归之二叉树的最小深度

    题目描述 给定一个二叉树,找出其最小深度. 最小深度是从根节点到最近叶子节点的最短路径上的节点数量. 说明: 叶子节点是指没有子节点的节点. 示例 输入:[3,9,20,null,null,15,7] ...

  3. 【LeetCode笔记】105. 从前序与中序遍历序列构造二叉树(Java、递归、二叉树、哈希表)

    文章目录 题目描述 代码 & 思路 题目描述 这题主要是考察前序.后序的性质,以及相互间的关系 代码 & 思路 前序:根 - 左 - 右: 中序:左 - 根 - 右,那么用前序数组的首 ...

  4. 非递归后序遍历二叉树总结(2种方法)

    算法 非递归后序遍历二叉树总结(2种方法) @author:Jingdai @date:2020.12.04 传送门 非递归先序遍历二叉树 非递归中序遍历二叉树 方法1 非递归用栈来辅助遍历,后序遍历 ...

  5. 【代码随想录二刷】Day20-二叉树-C++

    代码随想录二刷Day20 今日任务 654.最大二叉树 617.合并二叉树 700.二叉搜索树中的搜索 98.验证二叉搜索树 语言:C++ 654. 最大二叉树 链接:https://leetcode ...

  6. 代码随想录算法训练Day11 LeetCode232. 用栈实现队列(模拟);225.用队列实现栈(模拟);20. 有效的括号(栈应用);1047. 删除字符串中的所有相邻重复项(栈应用)

    代码随想录算法训练Day11 | LeetCode232. 用栈实现队列(模拟):225.用队列实现栈(模拟):20. 有效的括号(栈应用):1047. 删除字符串中的所有相邻重复项(栈应用) 关于栈 ...

  7. java根据前序和中序建树_Java实现根据前序遍历构建二叉树(前序遍历、中序遍历、后序遍历)...

    Java实现根据前序遍历构建二叉树(前序遍历.中序遍历.后序遍历),Java关于ACM的代码真的好少,想参考如何用java实现二叉树googl 前言 Java关于ACM的代码真的好少,想参考如何用ja ...

  8. 代码随想录算法训练营第30天 | 51. N皇后 37.解数独 332.重新安排行程 回溯篇小结

    代码随想录系列文章目录 回溯篇 - 棋盘问题 图的dfs 文章目录 代码随想录系列文章目录 51.N皇后 37.解数独 332.重新安排行程 回溯篇小结 51.N皇后 题目链接 这道题的思路是什么样的 ...

  9. 代码随想录训练营day36

    目录 题目一:无重叠区 解法: 题目二:划分字母区间 解法: 题目三:合并区间 解法: 题目一:无重叠区 力扣题目链接 题目描述: 给定一个区间的集合 intervals ,其中 intervals[ ...

最新文章

  1. 原生js实现点击按钮切换全屏!
  2. 跨浏览器设置标签样式
  3. 避免Java中的空指针异常
  4. 【HDU - 6231】K-th Number(二分,思维)
  5. 麻将游戏-协议实现 笔记
  6. AngularJS1.5+ 笔记
  7. 实现类似美团的下拉分级式菜单
  8. 2016 网易校招内推C/C++第二场8.6
  9. 【转】在IIS 7.0上使用自签证书来启用SSL
  10. linux bridge 添加fdb,Linux协议栈--网桥设备的实现
  11. Excel的格式类型
  12. linux测坏道脚本,linux测试硬盘坏道
  13. ABP-引入SqlSugar-简单版
  14. 网页游戏外挂的设计与编写:QQ摩天大楼【三】(登陆准备-信息发送方式)
  15. RationalDMIS 2020 SP25扫描测头构建与校验(山涧果子)
  16. 【学习笔记】标签噪声下用于鲁棒性学习的对称交叉熵损失函数
  17. Python平板电脑数据分析-课程大作业-部分源码
  18. CentOS 7.7 配置防火墙
  19. 自动驾驶专题介绍 ———— 超声波雷达
  20. Ubuntu 14.04开启root账号,禁用Guest账号

热门文章

  1. 【C语言】动态内存分配详解
  2. mac配置域名映射关系
  3. 证券数据如何到达客户端
  4. 南京大学计算机系本科生开放日,2018/7
  5. 自然人股东和法人股东的利弊
  6. 管理平台|智慧工地将成为施工界的“扛把子”!
  7. 在Linux下,SVN服务器的安装
  8. 干货 | 有哪些安慰剂按钮的设计?
  9. 基于ssm框架超市销售管理系统
  10. Focalprice李培亮:梦想让人在我店里排队