首页 > 编程语言 >代码随想录算法训练营第第14天 | 二叉树递归遍历(递归法、迭代、统一的迭代方法)

代码随想录算法训练营第第14天 | 二叉树递归遍历(递归法、迭代、统一的迭代方法)

时间:2024-05-21 23:21:35浏览次数:22  
标签:node right return 迭代 递归 随想录 root stack cur

递归遍历 (必须掌握)

二叉树的三种递归遍历掌握其规律后,其实很简单
题目链接/文章讲解/视频讲解:https://programmercarl.com/二叉树的递归遍历.html

迭代遍历 (基础不好的录友,迭代法可以放过)
题目链接/文章讲解/视频讲解:https://programmercarl.com/二叉树的迭代遍历.html

统一迭代 (基础不好的录友,迭代法可以放过)
这是统一迭代法的写法, 如果学有余力,可以掌握一下
题目链接/文章讲解:https://programmercarl.com/二叉树的统一迭代法.html

  1. 二叉树的前序遍历
一、递归写法,主要先理解递归三部曲
function traverse(node,arr) {
    if(node==null) return;
    arr.push(node.val);
    traverse(node.left,arr);
    traverse(node.right,arr);
}

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @return {number[]}
 */
var preorderTraversal = function(root) {
    if(root==null) return [];
    const res = [];
    traverse(root,res);
    return res;
};

二、迭代写法
/**
 * @param {TreeNode} root
 * @return {number[]}
 */
var preorderTraversal = function(root) {
    if (root==null) return [];
    const stack = [root];
    const res = [];
    while(stack.length){
        let cur = stack.pop();
        res.push(cur.val);
        cur.right && stack.push(cur.right);
        cur.left && stack.push(cur.left);
    }
    return res;
};
  1. 二叉树的中序遍历
一、递归写法
function traverse(node,arr) {
    if(node==null) return;
    traverse(node.left,arr);
    arr.push(node.val);
    traverse(node.right,arr);
    
}

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @return {number[]}
 */
var inorderTraversal = function(root) {
    if(root==null) return [];
    const res = [];
    traverse(root,res);
    return res;
}

二、迭代写法
/**
 * @param {TreeNode} root
 * @return {number[]}
 */
var inorderTraversal = function(root) {
    if (root == null) return [];
    const stack = [];
    const res = [];
    let cur = root;
    while(stack.length || cur){
        if(cur){
            stack.push(cur);
            cur = cur.left;
        } else {
            cur = stack.pop();
            res.push(cur.val);
            cur = cur.right;
        }
    }
    return res;
};


三、统一的迭代写法
/**
 * @param {TreeNode} root
 * @return {number[]}
 */
var inorderTraversal = function(root) {
    if (root == null) return [];
    const stack = [root];
    const res = [];
    while(stack.length) {
        let node = stack[stack.length-1];
        if (node !== null) {
            stack.pop();
            node.right && stack.push(node.right);
            stack.push(node);
            stack.push(null);
            node.left && stack.push(node.left);
        } else {
            stack.pop();
            let cur = stack.pop();
            res.push(cur.val);
        }
    }
    return res;
};

145

递归写法和中序先序的递归类似,在此不展示了

迭代写法
/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @return {number[]}
 */
var postorderTraversal = function(root) {
    if (root == null) return [];
    const stack = [root];
    const res = [];
    while(stack.length){
        let cur = stack.pop();
        res.push(cur.val);
        cur.left && stack.push(cur.left);
        cur.right && stack.push(cur.right);
    }
    return res.reverse();
};


统一的迭代写法
/**
 * @param {TreeNode} root
 * @return {number[]}
 */
var postorderTraversal = function(root) {
    if (root == null) return [];
    const res = [];
    const stack = [root];
    while(stack.length){
        let node = stack[stack.length-1];
        if (node!==null) {
            stack.pop();
            stack.push(node);
            stack.push(null);
            node.right && stack.push(node.right);
            node.left && stack.push(node.left);
        } else {
            stack.pop();
            let cur = stack.pop();
            res.push(cur.val);
        }
    }
    return res;
};

标签:node,right,return,迭代,递归,随想录,root,stack,cur
From: https://www.cnblogs.com/yuanyf6/p/18205150

相关文章

  • 递归地获取当前目录下所有文件的后缀名(不重复)
    好的,这里是修改后的批处理脚本,它将递归地获取当前目录下所有文件的后缀名,并将不重复的后缀名输出到当前目录下的a.txt文件中,然后结束:@echooffsetlocalenabledelayedexpansion::初始化一个空的集合用来存储后缀名set"suffixList="::递归遍历当前目录及其子目录下的所......
  • 迭代器、生成器
    迭代器【一】迭代器介绍迭代器就是用来迭代取值的工具,是重复反馈过程的程序目的是为了更加逼近我们想要的目标和结果每一次迭代得到的返回结果就是下一次迭代开始的初始值num_list=[1,2,3,4,5,6]count=0whilecount<len(num_list):#每一次使用的索引位置就是......
  • 在 JavaScript 中递归展开数组
    对嵌套数组使用递归:递归是处理嵌套数组的干净而有效的方法。它允许您处理任意深度的数组。使用该Array.isArray方法检查数组:这有助于确保代码适用于不同的数据类型并且更加健壮。 潜在性能问题:对大型数组要小心:处理非常深或很大的数组时,递归函数可能会导致堆栈溢出错误。在这......
  • 简单的加减乘除(递归)
    简单的加减乘除(递归)packagemethod;importjava.util.Scanner;publicclassTest{publicstaticvoidmain(String[]args){//简易的计算器Scannerscanner=newScanner(System.in);System.out.println("请输入第一个值:");doub......
  • 代码随想录算法训练营第十三天 | 239. 滑动窗口最大值 347. 前k个高频元素
    239.滑动窗口最大值题目链接文章讲解视频讲解思路:使用单调队列,来维护有可能成为最大值的元素;   当窗口向右滑动时,判断移除的元素是否是队首元素如果是的话出队;   新加入的元素依次和队尾元素作比较,如果大于队尾元素则将队尾元素循环出队,这样可以保证队列中始终维持......
  • 什么是递归?
    Tips:当你看到这个提示的时候,说明当前的文章是由原emlog博客系统搬迁至此的,文章发布时间已过于久远,编排和内容不一定完整,还请谅解`什么是递归?日期:2017-8-9阿珏谈天说地浏览:1616次评论:5条图片来源于网络一上来你肯定觉得读这句话好绕,好吃力。其实......
  • 二叉树 | 递归法 101.对称二叉树
    leetcode101.对称二叉树题目101.对称二叉树给你一个二叉树的根节点root,检查它是否轴对称。解题思路递归法,判断左节点的左孩子是否可以翻转成右节点的右孩子(左节点的左孩子==右节点的右孩子,左节点的右孩子==右节点的左孩子)递归三步骤:1、确定递归函数的入参和返回值......
  • 二叉树 | 迭代法 102.二叉树的层序遍历 429. N 叉树的层序遍历 226.翻转二叉树
    leetcode102.二叉树的层序遍历题目102.二叉树的层序遍历给你二叉树的根节点root,返回其节点值的层序遍历。(即逐层地,从左到右访问所有节点)。解题思路实现代码classTreeNode:def__init__(self,val=0,left=None,right=None):self.val=valse......
  • 二叉树的递归遍历 144.二叉树的前序遍历 145.二叉树的后序遍历 94.二叉树的中序遍历
    leetcode144.二叉树的前序遍历题目xxx解题思路实现代码leetcode145.二叉树的后序遍历题目xxx解题思路实现代码leetcode94.二叉树的中序遍历题目xxx解题思路实现代码......
  • Python学习迭代器(Iterator)
    一、可迭代的对象(Iterable)1、定义:可以直接用在循环的数据类型,如list,tuple,dict,set,str,还有generator(生成器),和带yield的函数,这些直接可以用在循环的对象统称为可迭代对象(Iterable)fromcollectionsimportIterableprint(isinstance([],Iterable))print(isin......