首页 > 编程语言 >二叉树中的递归算法(二)

二叉树中的递归算法(二)

时间:2023-07-01 22:22:48浏览次数:48  
标签:traverse 遍历 return 递归 算法 二叉树 root

从二叉树遍历看递归

  • 二叉树
    二叉树(binary tree)是指树中节点的度不大于2的有序树,它是一种最简单且最重要的树。 二叉树的递归定义为:二叉树是一棵空树,或者是一棵由一个根节点和两棵互不相交的,分别称作根的左子树和右子树组成的非空树;左子树和右子树又同样都是二叉树。

二叉树的遍历

  • 注意 :
    1、在遍历数组时我们发现只有一种遍历的策略就是随着 index -> 的递增进行遍历

    2、依据第一条,我们在使用递归算法进行数组遍历时也只有一种选择的策略
    public static void traverseArray(int index) {
        if (index == LEN) {
            System.out.println();
            // 递归边界无论有没有返回值都需要进行 return;
            return;
        }
        System.out.printf("%d " , array[index]);
        traverseArray(index + 1);
    }

  • 遍历
    1、二叉树在使用递归算法进行遍历时,由于有两条路径所以有两种向前策略
void traverse(TreeNode root) {
    if (root == null) {
        return;
    }
    // 前序位置 
    traverse(root.left); // 路径一
    // 中序位置
    traverse(root.right); // 路劲二
    // 后序位置
}

  • 注意这是有两条遍历路径的情况,那么如果有多条路径了
void traverse(TreeNode root) {
    if (root == null) {
        return;
    }
    for (TreeNode each : root.children) {
      traverse(each );
    }
}

注意:在使用递归算法时,如果需要进行数据的响应计算需要把数据进行复原,也就是说在前序逻辑时增加了一个,在后续逻辑处就需要减少一个。
1、包括在递归算法中使用的额外变量

int path[N];
bool st[N];
void dfs(int u) {
    if (u == n) {
        for (int i = 0 ; i < n ; i ++ ) printf("%d ",path[i]);
        printf("\n");
        
        return;
    }
    else {
        for (int i = 1 ; i <= n ; i ++ ) {
            if (!st[i]) {
                // 数据使用情况记录
                st[i] = true;
                path[u] = i;
                dfs(u + 1);
                // 在后续遍历位置进行数据还原,因为在新的一轮遍历中不需要使用前面一次遍历路径中使用的数据。如果不还原会导致脏数据的出现
                st[i] = false;
            }
        }
        
    }
}

标签:traverse,遍历,return,递归,算法,二叉树,root
From: https://www.cnblogs.com/ayizzz/p/17520059.html

相关文章

  • 2023-07-01:redis过期策略都有哪些?LRU 算法知道吗?
    2023-07-01:redis过期策略都有哪些?LRU算法知道吗?答案2023-07-01:缓存淘汰算法(过期策略)当Redis的内存超出物理内存限制时,内存中的数据就会频繁地与磁盘进行交换,这个过程叫做交换(swap)。由于交换的高开销,Redis的性能会急剧下降。对于访问频率较高的Redis实例来说,这样低效的存取效率......
  • 2023-07-01:redis过期策略都有哪些?LRU 算法知道吗?
    2023-07-01:redis过期策略都有哪些?LRU算法知道吗?答案2023-07-01:缓存淘汰算法(过期策略)当Redis的内存超出物理内存限制时,内存中的数据就会频繁地与磁盘进行交换,这个过程叫做交换(swap)。由于交换的高开销,Redis的性能会急剧下降。对于访问频率较高的Redis实例来说,这样低效的存取效率几乎......
  • 列车算法
    [资料来源](http://www.ssw.uni-linz.ac.at/General/Staff/TW/Wuerthinger05Train.pdf)http://www.ssw.uni-linz.ac.at/General/Staff/TW/Wuerthinger05Train.pdf程序可以在两次垃圾收集运行之间执行任何操作,例如更改指针。为了便于讨论,我们假设一个对象只适合于一个单块。考虑以......
  • 一文读懂 Paxos 算法
    博主介绍:✌博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家,WEB架构师,阿里云专家博主,华为云云享专家✌......
  • 众所周知,梯度下降法是一种基本的优化算法,不能保证全局最优,也不能保证效率。为什么它仍
    梯度下降法在深度学习中被广泛应用的原因主要有以下几点:适用性广泛:梯度下降法可以应用于各种深度学习模型,包括神经网络、卷积神经网络、循环神经网络等。而传统的凸优化算法和粒子群算法往往只适用于特定类型的优化问题。原理简单:梯度下降法的原理相对简单,易于理解和实现。......
  • JZ82 二叉树中和为某一值的路径(一)
    二叉树递归/***structTreeNode{*intval;*structTreeNode*left;*structTreeNode*right;*TreeNode(intx):val(x),left(nullptr),right(nullptr){}*};*/classSolution{public:/***代码中的类名、方法名、参数名已经......
  • 理解KMP算法
    KMP算法一.介绍KMP算法是一种高效的字符串匹配算法,其时间复杂度为O(n+m),其主要原因是目标串指针不回溯。1.1为什么目标串指针不用回溯?1.1.1什么是前后缀?**前缀是指不包含最后一个字符的所有以第一个字符开头的连续子串;后缀是指不包含第一个字符的所有以最后一个字符结尾......
  • 八大排序算法——快速排序
    #include<iostream>#include<cstring>#include<algorithm>usingnamespacestd;constintN=1000010;intn;intq[N];voidquick_sort(intl,intr)//快速排序{if(l>=r)return;inti=l-1,j=r+1,x=q[(l+r......
  • 算法学习day03链表part01-203、707、206
    packageSecondBrush.LinkedList.LL1;/***203.移除链表元素*删除链表中等于给定值val的所有节点。*自己再次概述一下这个过程:*1.移除元素,要采用设置虚拟节点的方式,因为那样不需要考虑头结点问题*2.设置两个虚拟指向*3.移除元素就是遍历链表,然后碰到目标值......
  • 算法学习day04链表part02-24、19、0207、142
    packageSecondBrush.LinkedList.LL1;/***24.两两交换链表中的节点**/publicclassSwapNodesInPairs_24{publicListNodeswapPairs(ListNodehead){ListNodedummyhead=newListNode(-1);dummyhead.next=head;ListNodecur......