代码随想录算法训练营第12天 | 二叉树部分: 种类,定义,遍历方法

二叉树部分

理论基础

二叉树的种类, 存储方式, 遍历方式,二叉树的定义
二叉树的种类:满二叉树,完全二叉树,二叉排序树(二叉搜索树),平衡二叉搜索树(树是一个空树或者它的左右子树的高度差不超过1)
存储方式:链式,顺序(数组)

遍历方式:深度优先遍历(先序,中序,后续),广度优先遍历(层次遍历)
二叉树的定义:
二叉树的定义代码:

class TreeNode{int val;TreeNode left;TreeNode right;public TreeNode(){}public TreeNode(int val){this.val=val;}//这边忘记了public TreeNode(int val,TreeNode left,TreeNode right){this.val=val;this.left=left;this.right=right;}
}

递归遍历(这边之前刷的不好,感觉直接写的话不会)

前序遍历,中序遍历,后序遍历

基本步骤:
参数和返回值
终止条件
确定单层递归的逻辑

public List<Integer> preorderTraversal(TreeNode root) {List<Integer> list=new LinkedList<>();preOrder(root,list);return list;}//返回值和参数:因为最后需要输出链表,所以传入的参数需要带上链表存放每一次遍历的值//不需要返回值public void preOrder(TreeNode cur,List<Integer> list){a        //终止条件:当当前节点为空的时候,本层递归就直接结束if(cur==null){return ;}//本层递归的逻辑,先根后左右list.add(cur.val);preOrder(cur.left,list);preOrder(cur.right,list);}

中序遍历

public List<Integer> inorderTraversal(TreeNode root) {List<Integer> list=new LinkedList<>();inOrder(root,list);return list; }//参数的返回类型和参数public void inOrder(TreeNode root,List<Integer> list){//终止条件,当节点为空的之后直接返回if(root==null){return ;}//单层循环的条件:先左后中最后后inOrder(root.left,list);list.add(root.val);inOrder(root.right,list);}

后序遍历

public List<Integer> postorderTraversal(TreeNode root) {List<Integer> list=new LinkedList<>();postOrder(root,list);return list;}//返回值和需要的参数public void postOrder(TreeNode node,List<Integer> list){//终止条件if(node==null){return;}postOrder(node.left,list);postOrder(node.right,list);list.add(node.val);}

迭代遍历

迭代遍历,直接写的话也记不起来了,看一下解释

递归的实现:每一次递归调用把函数的局部变量,函数值,返回地址等压入调用栈中,递归返回时,从栈顶弹出上一次递归的各项参数,所以可以采用栈实现二叉树的遍历

不会写,感觉一点思路都不没有,不知道声明了栈之后,该干什么, 如果是循环的判断根节点不为空,然后将左右节点入栈的话,如何让左右节点出栈呢,这边可能会用到右节点先进,左节点后进

答案的思路:先让根节点入栈,然后根节点出栈,当根节点的左右节点不为空的时候,右左节点分别入栈,循环的条件是栈不为空

前序迭代法的实现

public List<Integer> preorderTraversal(TreeNode root) {List<Integer> list=new LinkedList<>();if(root==null){return list;}Stack<TreeNode> st=new Stack<>();//栈中存放的是节点st.push(root);while(!st.isEmpty()){TreeNode node=st.pop();list.add(node.val);if(node.right!=null){st.push(node.right);}if(node.left!=null){st.push(node.left);}}return list;}

感觉中序和后序遍历的迭代完全不是一个路子,因为此时的节点暂时不满足出栈的条件,但是又不知道什么时候该出栈

中序遍历的迭代法,能看懂,写不出来
后序遍历的迭代法,能看懂,写不出来

//中学遍历的迭代法
public List<Integer> inorderTraversal(TreeNode root) {List<Integer> list=new LinkedList<>();if(root==null){return list;}Stack<TreeNode> st=new Stack<>();TreeNode cur=root;while(cur!=null || !st.isEmpty()){if(cur!=null){st.push(cur);cur=cur.left;}else{cur=st.pop();list.add(cur.val);cur=cur.right;}}return list;}
//后序遍历的迭代法
```java
public List<Integer> postorderTraversal(TreeNode root) {List<Integer> result = new ArrayList<>();if (root == null){return result;}Stack<TreeNode> stack = new Stack<>();stack.push(root);while (!stack.isEmpty()){TreeNode node = stack.pop();result.add(node.val);if (node.left != null){stack.push(node.left);}if (node.right != null){stack.push(node.right);}}Collections.reverse(result);return result;}

二叉树部分: 种类,定义,遍历方法相关推荐

  1. 二叉树的几种遍历方法

    二叉树的遍历是指从根结点出发,按照某种次序依次访问二叉树中所有结点,使得每个结点被访问一次且仅被访问一次.根据定义中的某种次序,二叉树的遍历方式主要分为前序遍历,中序遍历,后序遍历以及层序遍历. 前序 ...

  2. 全面剖析【二叉树】的各类遍历方法

    二叉树遍历 二叉树的遍历主要有四种: 前序.中序.后序和层序 遍历的实现方式主要是: 递归和非递归 递归遍历的实现非常容易,非递归的实现需要用到栈,难度系数要高一点. 1.二叉树节点的定义 二叉树的每 ...

  3. 数据结构与算法 | 二叉树四种的遍历方法(递归与非递归)

    二叉树的遍历是指从根节点出发,按照某种次序依次访问二叉树的所有节点,使得每个节点被访问且只访问一次. 而一般有四种遍历方法: 前序.中序.后序.层序,下面就分别讲一下四个遍历的思路以及代码实现 例如我 ...

  4. 二叉树的四种遍历方法(前序遍历、中序遍历、后序遍历、层序遍历)有图有真相!!!

    文章目录 二叉树的四种遍历方式 前序遍历(Preorder Traversal) 中序遍历(Inorder Traversal) 后序遍历(Postorder Traversal) 层序遍历(Leve ...

  5. 二叉树的四种遍历方法:前序、中序、后序、层次

    前/中/后序遍历也可分别称为前/中/后根遍历 #include <iostream> using namespace std;//二叉树的链式存储的结点 typedef struct Bi ...

  6. (九)二叉树的建立与遍历方法(c语言)(附代码与调试)

    一.二叉树 首先我们聊一聊什么是二叉树,二叉树就是n个节点的有限集合,该集合或者空集(称为空二叉树),或者由一个根节点和两课互不相交的分别称为根节点的左子树和右子树的二叉树组成. 一看这,嗨哟,挺复杂 ...

  7. 二叉树(构造与遍历方法)

    文章目录 二叉树 一.二叉树的构造 二.二叉树的深度遍历 1. 前序遍历 2. 中序遍历 3. 后序遍历 三.二叉树转链表 二叉树 一.二叉树的构造 #include<cstdio>usi ...

  8. 二叉树的概念及其遍历方法 - python实现

    二叉树 二叉树的基本概念 二叉树是每个节点最多有两个子树的树结构.通常子树被称作"左子树"(left subtree)和"右子树"(right subtree) ...

  9. Python实现二叉树的三种深度遍历方法!

    python代码实现了二叉树,这次将会实现二叉树的几种遍历方法,来更好的解析二叉树的结构特点.分别是一种广度遍历,和三种深度遍历方法:先序遍历,中序遍历,后序遍历.下面是代码实现: 1.先序遍历 遍历 ...

  10. 二叉树遍历方法——前、中、后序遍历(图解)

    目录 一.前序遍历 (1)递归版本 (2)非递归版本 二.中序遍历 (1)递归版本 (2)非递归版本 三.后序遍历 (1)递归版本 (2)非递归版本 四.总结 五.测试程序 六.程序输出 二叉树的遍历 ...

最新文章

  1. 本地服务器文件恢复,本地服务器文件恢复
  2. Linux Kernel TCP/IP Stack — 协议栈收包处理流程
  3. VS 2012 如何发布 ASP.NET 网站到本地IIS
  4. HLS—AXI4-Lite Interface
  5. 4怎么放大字体_Word字体怎么放大?简单教你几招轻松搞定
  6. 老赵书托(1):写在前面
  7. 用python画三维图、某区域的高程,python - 在PyQt中绘制具有高程和降低效果的3D矩形/多边形 - SO中文参考 - www.soinside.com...
  8. Scala学习笔记02:数据类型、常量与变量
  9. 敏捷开发一千零一问系列之十八:长期受制于强势客户怎么办?(下)
  10. 博客链接—Python
  11. python处理rgb_如何读取Python中给定像素的RGB值?
  12. 计算机无法屏保,Win7屏幕保护程序不能修改怎么办 win7无法设置电脑屏幕保护程序如何解决...
  13. PHP+txt聊天室
  14. OpenCV之图像轮廓
  15. 如何保留5个有效数字输出c不4舍5入_好吃好喝不发胖,这样过年才健康团
  16. c语言编译bss和data,bss段和data段的区别
  17. 大数据日志分析Hadoop项目实战
  18. 有 1000 瓶药物,但是其中有一瓶是有毒的,老鼠只要服用任意量有毒药水就会在一个星期内死掉!请问,在一个星期后找出有毒的药物,最少需要多少只小白鼠?
  19. 自动化脚本腾讯云配置集群(三)批量修改host
  20. C++ LinuxWebServer 2万7千字的面经长文(上)

热门文章

  1. 《影响力》| 我们是如何被说服的?
  2. api工厂小程序好物圈插件使用教程
  3. java fel api_Java表达式计算-Fel
  4. mysql添加索引的命令与使用解析
  5. 解决问题最有效的方法和技巧就是---花钱
  6. 夜光带你走进C# winform电气单片机(二十七)擅长的领域
  7. turtle表情 vs emoji表情
  8. 钽电容和陶瓷电容区别分析
  9. 暑期实习面经(NLP 方向)达摩院、腾讯、微软、美团、百度
  10. QList和QVector速度比较