首页 > 编程语言 >代码随想录算法训练营第十四天|理论基础 ● 递归遍历 ● 迭代遍历 ● 统一迭代

代码随想录算法训练营第十四天|理论基础 ● 递归遍历 ● 迭代遍历 ● 统一迭代

时间:2023-06-07 13:32:17浏览次数:65  
标签:node 遍历 TreeNode val 迭代 deq 第十四天 二叉树

理论基础

满二叉树概念

完全二叉树概念

二叉搜索树概念

平衡二叉搜索树概念

二叉树存储方式:链式存储和顺序存储

二叉树遍历方式:前中后序遍历,层次遍历。

二叉树的代码定义

public class TreeNode{
  int val;
  TreeNode left;
  TreeNode right;
  TreeNode(){}
  TreeNode(int val){this.val = val;}
  TreeNode(int val, TreeNode left, TreeNode right){
    this.val = val;
    this.left = left;
    this.right = right;
  }
}

二叉树递归遍历

确定递归三要素:

1、确定递归函数的参数和返回值

2、确定终止条件

3、确定单层递归的逻辑。

如果是递归遍历的话,要素一,参数是根节点root,返回值是数组res;要素二,挡遍历的节点为空,就递归结束;要素三,单层递归就是判断中左右,还是左中右,还是左右中。


二叉树迭代遍历

非递归遍历方法,借用栈的结构,如果是前序,中-左-右,入栈顺序为中-右-左;中序,左-中-右,入栈为左-右,不断遍历直到节点是空为止;

后续为左右中,入栈,中左右,出栈中右左,最后翻转。


二叉树统一迭代

相当于对中节点的暂时不处理,当中节点入栈后,紧跟其后加个null节点,这样一旦出栈遇到null,就可以对中节点进行处理。

//后序->左右中, 入栈->中右左
class Solution {
    public List<Integer> postorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<>();
        Deque<TreeNode> deq = new LinkedList<>();
        if(root != null) deq.push(root);
        while(!deq.isEmpty()){
            TreeNode node = deq.peek();
            if(node != null){
                deq.poll();
                //左右中
                deq.push(node);
                deq.push(null);
                if(node.right != null) deq.push(node.right);
                if(node.left != null) deq.push(node.left);
            }else{
                deq.pop();
                node = deq.peek();
                deq.pop();
                res.add(node.val);
            }
        }
        return res;
    }
}

标签:node,遍历,TreeNode,val,迭代,deq,第十四天,二叉树
From: https://blog.51cto.com/u_15505301/6431081

相关文章

  • 图的遍历
    图的遍历标签(空格分隔):DS图深度优先遍历(DFS)思路:1.定义一个bool型数组记录已被访问过的顶点,并初始化为0,表示都还没访问过2.从其中一个未被访问过的顶点出发深度优先遍历2.1如果是连通图,则此操作只执行一回,即只从一个顶点出发2.2如果不连通,则有几个联通分量就执行......
  • 2023年6月6日,泛型,迭代器
    1.泛型1.泛型泛型是一种数据安全的做法,限制了集合中元素的类型ArrayList<String>objects=newArrayList<>();/***<E>元素*<T>类型*<K,V>键值*<N,V>名值*@param<E>*/publicclassMyArrayList<E>{publicvoidadd(Ee){}}......
  • 数据结构与算法分析(Java语言描述)(27)—— 深度优先遍历与连通分量
    packagecom.dataStructure.graph;//求无权图的联通分量publicclassComponents{privateGraphgraph;//存放输入的数组privateboolean[]visited;//存放节点被访问状态privateintcomponentCount;//连通分量的数量privateint[]mark;//......
  • 2023-06-06:给你二叉树的根结点 root ,请你设计算法计算二叉树的 垂序遍历 序列。 对位
    2023-06-06:给你二叉树的根结点root,请你设计算法计算二叉树的垂序遍历序列。对位于(row,col)的每个结点而言,其左右子结点分别位于(row+1,col-1)和(row+1,col+1)树的根结点位于(0,0)。二叉树的垂序遍历从最左边的列开始直到最右边的列结束,按列索引每一列上......
  • 2023-06-06:给你二叉树的根结点 root ,请你设计算法计算二叉树的 垂序遍历 序列。 对位
    2023-06-06:给你二叉树的根结点root,请你设计算法计算二叉树的垂序遍历序列。对位于(row,col)的每个结点而言,其左右子结点分别位于(row+1,col-1)和(row+1,col+1)树的根结点位于(0,0)。二叉树的垂序遍历从最左边的列开始直到最右边的列结束,按列索引每一......
  • 56 数组遍历求和;找能被3整除的数
    packagecom.fqs.test;publicclasshello{publicstaticvoidmain(String[]args){//定义一个数组,存储12345求和int[]arr={1,2,3,4,5};intsum=0;for(inti=0;i<arr.length;i++){sum=sum+arr[i];}......
  • Qt迭代器(Java类型和STL类型)详解
    迭代器为访问容器类里的数据项提供了统一的方法,Qt有两种迭代器类:Java类型的迭代器和STL类型的迭代器。两者比较,Java类型的迭代器更易于使用,且提供一些高级功能,而STL类型的迭代器效率更高。 Java类型迭代器对于每个容器类,有两个Java类型迭代器:一个用于只读操作,一个用于......
  • 迭代器和异常捕捉
    可迭代对象可迭代对象的定义:内置有__iter__()方法的都可以称之为是可迭代对象。可迭代对象有:字符串、列表、元组、字典、集合等迭代器对象迭代器对象:迭代器迭代器对象的定义:既内置了__iter__()方法,又内置了__next__方法就是迭代器对象迭代器是一种不依赖于索引取......
  • 树的广度优先遍历
    树的广度遍历       广度优先遍历又称宽度优先遍历,缩写为BFS,和深度优先遍历DFS不同的是深度优先是指的同一个树先将某节点所有子节点遍历完后再遍历其兄弟节点。而BFS是先把同一层级的节点遍历完后再遍历下一级的子节点。BFS       即同一层级遍历完然后到下一层级。......
  • 树之深度优先遍历算法详解(DFS实现) LeetCode94
           本文以如下树结构为例深度优先(DeepFirstSearch)       树的孩子称作子树,对于一个树进行深度优先遍历,即将其某一子树下所有节点遍历完再去遍历其他子树。遍历的顺序以根为参照可分为先序遍历,中序遍历,后序遍历。遍历方式描述先序遍历根左右中序遍历左根右后......