首页 > 编程语言 >道长的算法笔记:树结构递归模型

道长的算法笔记:树结构递归模型

时间:2022-11-21 17:23:49浏览次数:40  
标签:Node 道长 递归 树结构 list 链表 节点

(一) 线性结构的递归模型

 链表是一种天然带有递归性质的结构,当我们想要处理 \(Node_A\) 为首的链表,我们尝试处理 \(Node_B\) 为首的链表,然后再单独处理节点 \(A\),类似的,对以 \(Node_B\) 为首的链表我们可以尝试处理 \(Node_C\) 为首的链表,然后再单独处理节点 \(B\),以此类推。当走到末尾空节点的时候,我们返回,逐层的弹出函数的栈帧。

image

 只不过链表是一种线性结构,通常使用循环的方式也可以很容易地实现相关的算法,然而若能在链表一节中打下坚实的基础,在学习树结构的递归模型的会变得非常顺手。 不妨先来回忆一下线性递归模型在链表结构中的几个场景应用,例如打印一个链表、反转一个链表等操作。我们以打印链表为例,我们给出两段非常简短的代码,出于简便,代码中我们使用-1代表空节点,数字 1/2/3/4 分别代表 A/B/C/D,对于链表 \(A \to B\to C \to D\),函数 \(f_1\)、\(f_2\) 会分别打印 \(\{A,B,C,D\}\) 与 \(\{D,C,B,A\}\)。

int list[5] = {1, 2, 3, 4, -1};
void f1(int *list){
    if (*list == -1)
        return;
    printf("%c ", *list + 'A' - 1); // 代码主体逻辑写在递归函数之前
    f1(list + 1);                   // 递归函数
}//最终打印:A B C D

void f2(int *list){
    if (*list == -1)
        return;
    f2(list + 1);                  // 递归函数
    printf("%c ", *list + 'A' - 1); // 代码主体逻辑写在递归函数之后
}//最终打印:D C B A

image

 其中前者称为前序遍历,是指函数递归之前就执行代码的主体逻辑,后者称为后序遍历,是指函数递归之后才执行代码的主体逻辑。前序与后序两种遍历方式,不仅适用于线性结构,其同样适用于树结构。

(二) 二叉树带根树模型

 二叉树带根树,是指每个节点只有不大于两个孩子且给定一个指定的根节点的树结构,LeetCode 平台上面绝大部分的树型结构问题均是给定二叉树带根树。


(三) 多叉无根树模型

标签:Node,道长,递归,树结构,list,链表,节点
From: https://www.cnblogs.com/taoist-chen/p/16912016.html

相关文章

  • 二叉树交换左右子树递归以及非递归算法
    递归方式基本思想:1、当待处理节点非空时,判断其左右孩子是否不同时为空:若是,转到2、否则分别递归调用左右子树进行操作。2、新建一个辅助结点,执行交换操作。3、递归调用......
  • 递归删除大于30天的旧日志
    /***递归删除大于30天的旧日志*/privatestaticvoiddeleteOldLogFiles(Filedir){if(dir.isDirectory()){File[]files=dir.lis......
  • Leetcode 799.香槟塔:动态规划+递归
    香槟塔:动态规划+递归题目来源:Leetcode22/11/20每日一题:799.香槟塔https://leetcode.cn/problems/champagne-tower我们把玻璃杯摆成金字塔的形状,其中第一层有1个玻......
  • 利用递归求两个数的最大公约数
    #include<stdio.h>inthcf(intn1,intn2);intmain(){intn1,n2;printf("输入两个正整数:");scanf("%d%d",&n1,&n2);printf("%d和%d的最大公约数......
  • 逆向递归加正向递归,将无规则树 重建成一棵完整的树
    逆向递归加正向递归,将无规则树重建成一棵完整的树背景后台在一个部门树上任意勾选,然后前端需要知道勾选后重新生成的树,没有父级的找上级依次类推。最近递归写的......
  • 82:递归函数_阶乘计算案例
    【操作】使用递归函数计算阶乘(factorial)deffactorial(n):ifn==1:return1returnn*factorial(n-1)foriinrange(1,6):print(i,......
  • 81:递归函数_函数调用内存分析_栈帧的创建
    ###递归函数递归函数指的是:自己调用自己的函数,在函数体内部直接或间接的自己调用自己。递归类似于大家中学数学学习过的“数学归纳法”。每个递归函数必须包含两个部分:1.......
  • 337. 打家劫舍 III ----- 动态规划、递归、剪枝、分类讨论
    小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为 root 。除了 root 之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到......
  • 236. 二叉树的最近公共祖先 ----- 图解递归,排除左/右子树
    给定一个二叉树,找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树T的两个节点p、q,最近公共祖先表示为一个节点x,满足x是p、q......
  • Day14.1:递归
    递归理解:当A方法调用A方法,也就是方法自身调用自身。案例:定义阶乘的方法,并求出5!。publicclassDemo{publicstaticvoidmain(String[]args){System.out......