首页 > 其他分享 >01_二叉树的递归遍历

01_二叉树的递归遍历

时间:2023-11-06 10:55:04浏览次数:38  
标签:遍历 递归 List 01 二叉树 root result

二叉树的递归遍历

递归算法的三要素

  1. 确定递归函数的参数和返回值:确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数,并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。
  2. 确定终止条件:写完了递归算法,运行的时候,经常会遇到栈溢出的错误,就是没写终止条件或者终止条件写的不对,操作系统也是用一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统的内存栈必然就会溢出。
  3. 确定单层递归的逻辑:确定每一层递归需要处理的信息。在这里也就会重复调用自己来实现递归的过程。

以下以前序遍历为例:

  • 确定递归函数的参数和返回值:因为要打印出来前序遍历节点的数值,所以参数里需要传入List来放节点的数值,除了这一点就不需要再处理什么数据了也不需要有返回值,所以递归函数返回类型就是void,代码如下:
void traversal(TreeNode cur, List<Integer> result);
  • 确定终止条件:在递归过程中,如何算是递归结束了呢,当然是当前遍历的节点为null,那么本层递归就要结束了,所以如果当前遍历的这个节点是null,就直接返回,代码如下:
if (cur == null)  return;
  • 确定单层递归的逻辑:前序遍历是中左右的顺序,所以在单层递归的逻辑,就是先取中节点的数值,代码如下:
result.add(cur.val);  //中
traversal(cur.lchild, result);  //左
traversal(cur.rchild, result);  //右

单层递归的逻辑就是按照中左右的顺序来处理的,这样二叉树的前序遍历,基本就写完了,再看一下完整代码:

//前序遍历  递归  LC144_二叉树的前序遍历
class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> result = new ArrayList<Integer>();
        preorder(root, result);
        return result;
    }
    public void preorder(TreeNode root, List<Integer> result) {
        if (root == null) {
            return;
        }
        result.add(root.val);
        preorder(root.lchild, result);
        preorder(root.rchild, result);
    }
}
//中序遍历  递归  LC94_二叉树的中序遍历
class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> result = new ArrayList<>();
        inorder(root, result);
        return result;
    }
    public void inorder(TreeNode root, List<Integer> result) {
        if (root == null) {
            return;
        }
        inorder(root.lchild, result);
        list.add(root.val);
        inorder(root.rchild, result);
    } 
}
//后序遍历  递归  LC145_二叉树的后序遍历
class Solution {
    public List<Integer> postorderTraversal(TreeNode root) {
        List<Integer> result = new ArrayList<>();
        postorder(root, result);
        return result;
    }
    public void postorder(TreeNode root, List<Integer> result) {
        if (root == null) {
            return;
        }
        inorder(root.lchild, result);
        inorder(root.rchild, result);
        list.add(root.val);
    } 
}

标签:遍历,递归,List,01,二叉树,root,result
From: https://www.cnblogs.com/codingbao/p/17812074.html

相关文章

  • 力扣905 按奇偶排序数组 C++ 双指针+一次遍历
    905.按奇偶排序数组classSolution{public:vector<int>sortArrayByParity(vector<int>&nums){inti=0,j=nums.size()-1;while(i<nums.size()-1&&i<j){while(i<j&&(nums[i]%2==0))i++;......
  • 【刷题笔记】101. Symmetric Tree
    题目Givenabinarytree,checkwhetheritisamirrorofitself(ie,symmetricarounditscenter).Forexample,thisbinarytree[1,2,2,3,4,4,3]issymmetric:1/\22/\/\3443Butthefollowing[1,2,2,null,3,null,3]isnot:1......
  • C++_01_初步认识C++语言 - 重写版
    一、认识“C++语言”一、首先聊聊什么是语言?语言是一套具有“语法”、“词法”规律的系统,是思维的工具。计算程序设计语言是计算机可以识别的语言,用于描述解决问题的方法,供计算机阅读和执行。语言由低级到高级依次分为4类:1、机器语言     (由......
  • 【C#】关于GB/T 13989-2012分幅编号及坐标计算
    1publicstaticclassStandardSubdivisionConvertor2{3///<summary>4///通过图幅号获取四角经纬度坐标5///</summary>6///<paramname="subdivCode"></param>7///<re......
  • HDU7401 流量监控
    给定一颗\(n\)个节点的树。求:有多少种匹配\((a_1,b_{1}),\cdots,(a_{\frac{n}{2}},b_{\frac{n}{2}})\),使得对于每一对匹配\((u,v)\),点\(u\)是点\(v\)的祖先。对于一组合法匹配,定义其权值为这些匹配的交点个数。对于两组匹配\((a,b),(c,d)\),它们之间有一个交点当且仅当......
  • 2023-2024-1 20231301 《计算机基础与程序设计》第六周学习总结
    2023-2024-120231301《计算机基础与程序设计》第六周学习总结作业信息作业链接作业课程<班级>(2023-2024-1-计算机基础与程序设计)作业要求<作业>(2023-2024-1计算机基础与程序设计第六周学习总结)作业目标<《计算机基础与程序设计》预习第七章>《计算机基础......
  • 对字符串的内容进行遍历
    对字符串的内容进行遍历。 s="今天是星期一,大家都很忙!"count=0whilecount<len(s):print(s[count])count+=1运行结果:  ......
  • 110115
    一场比赛中共有 n 支队伍,按从 0 到  n-1 编号。给你一个下标从 0 开始、大小为 n*n 的二维布尔矩阵 grid 。对于满足 0<=i,j<=n-1 且 i!=j 的所有 i,j :如果 grid[i][j]==1,那么 i 队比 j 队 强 ;否则,j 队比 i 队 强 。在这场比赛......
  • P3722 [AH2017/HNOI2017] 影魔
    题目链接Part1先想暴力,对于每次询问,可以直接\(\Theta(n^2)\)枚举数对,用\(ST\)表判断一下,复杂度为\(\Theta(qn^2)\)。发现枚举数对没有前途,考虑\((i,j)\)之间的最大值,发现一个数对产生的贡献只和区间的最大值有关,我们从这个最大值入手。我们把一个数对的贡献看做其区间最......
  • java.time.format.DateTimeParseException: Text ‘202310132358‘ could not be pars
    你遇到的问题是由于在解析日期和时间时格式不正确。Java无法解析‘202310132358’这个字符串,因为它不符合Java日期时间格式。Java期望的日期时间格式通常是“yyyy-MM-ddHH:mm:ss”,其中:yyyy是四位数的年份MM是两位数的月份dd是两位数的日期HH是两位数的小时(24小时制)mm是两......