【算法】递归解决各种数据结构的遍历问题

简介: 【算法】递归解决各种数据结构的遍历问题

前言

对于递归算法,我们最先想到的应该就是用递归的方式去中序遍历一棵树,递归的使用使得我们可以先深入到下层中,然后慢慢的输出下层的元素之后输出上层元素。

因此,基于此,我们甚至可以使用递归来逆序输出一个栈,链表等数据结构。

递归输出树

使用递归输出树

逆序输出栈

使用递归逆序输出一个栈的内容

递归逆序输出链表

与上面逆序输出一个栈差不多,我们可以设定输出链表内容的条件,我们可以先让链表不断的向内遍历,遍历到尾节点没有下一个节点了,我们才开始输出链表的内容,那么就可以做到逆序输出链表的内容了。

public void reverseList(ListNode head){
        if(head!=null){
            reverseList(head.next);
            System.out.println(head.val);
        }
    }

基于这种方式,我们甚至可以使用递归来判断一个链表是不是回文链表。

currentNode 指针是先到尾节点,由于递归的特性再从后往前进行比较。frontPointer 是递归函数外的指针。若 currentNode.val != frontPointer.val 则返回 false。反之,frontPointer 向前移动并返回 true。

算法的正确性在于递归处理节点的顺序是相反的(回顾上面打印的算法),而我们在函数外又记录了一个变量,因此从本质上,我们同时在正向和逆向迭代匹配。

计算机在递归的过程中将使用堆栈的空间,这就是为什么递归并不是 O(1) 的空间复杂度。

package com.leetcode.learn.list.easy;
import com.leetcode.learn.list.ListNode;
/**
 * @author: 张锦标
 * @date: 2023/6/10 11:15
 * PalindromeList类
 */
public class PalindromeList {
    private ListNode frontPointer;
    private boolean recursivelyCheck(ListNode currentNode) {
        if (currentNode != null) {
            if (!recursivelyCheck(currentNode.next)) {
                return false;
            }
            if (currentNode.val != frontPointer.val) {
                return false;
            }
            frontPointer = frontPointer.next;
        }
        return true;
    }
    public boolean isPalindrome(ListNode head) {
        frontPointer = head;
        return recursivelyCheck(head);
    }
    //public boolean isPalindrome(ListNode head){
    //    StringBuilder sb = new StringBuilder();
    //    ListNode temp = head;
    //    while(temp!=null){
    //        sb.append(temp.val);
    //        temp=temp.next;
    //    }
    //    return sb.toString().equals(sb.reverse().toString());
    //}
    public void reverseList(ListNode head){
        if(head!=null){
            reverseList(head.next);
            System.out.println(head.val);
        }
    }
}

递归判断字符串是否是回文串

使用递归的方式,我们也可以用来判断一个字符串是否是回文串。

我们可以将字符串按照中心划分两半,使用两个指针分别指向字符串的开头和末尾然后向中间遍历。不断判断这两个指针是否相同,如果是,那么指针向中间继续移动。

package com.leetcode.learn.string;
/**
 * @author: 张锦标
 * @date: 2023/6/10 11:44
 * RecusionHuiwen类
 * 使用递归的方式来判断一个字符串是否是回文串
 */
public class RecusionHuiwen {
    public static boolean isPalindrome(String s,int n,int m){
        if (m<=1){ //递归结束条件
            return true;
        }else if(s.charAt(n)==s.charAt(m-1)){ //判断当前两个对称位置是否相同
            return isPalindrome(s,n+1,m-1); //相同继续向后遍历递归
        }
        return false;
    }
    public static void main(String[] args) {
        String s = "abccba";
        System.out.println(isPalindrome(s, 0, s.length()));
    }
}


相关文章
|
4天前
|
机器学习/深度学习 算法 Java
[算法与数据结构] 谈谈线性查找法~
该文章详细介绍了线性查找法的基本概念与实现方法,通过Java代码示例解释了如何在一个数组中查找特定元素,并分析了该算法的时间复杂度。
|
24天前
|
存储 算法 C语言
数据结构基础详解(C语言): 二叉树的遍历_线索二叉树_树的存储结构_树与森林详解
本文从二叉树遍历入手,详细介绍了先序、中序和后序遍历方法,并探讨了如何构建二叉树及线索二叉树的概念。接着,文章讲解了树和森林的存储结构,特别是如何将树与森林转换为二叉树形式,以便利用二叉树的遍历方法。最后,讨论了树和森林的遍历算法,包括先根、后根和层次遍历。通过这些内容,读者可以全面了解二叉树及其相关概念。
|
2月前
|
机器学习/深度学习 人工智能 算法
【人工智能】线性回归模型:数据结构、算法详解与人工智能应用,附代码实现
线性回归是一种预测性建模技术,它研究的是因变量(目标)和自变量(特征)之间的关系。这种关系可以表示为一个线性方程,其中因变量是自变量的线性组合。
49 2
|
2月前
|
算法
【算法】递归、搜索与回溯——汉诺塔
【算法】递归、搜索与回溯——汉诺塔
|
2月前
【数据结构】遍历二叉树(递归思想)-->赋源码
【数据结构】遍历二叉树(递归思想)-->赋源码
47 4
|
3月前
|
存储 算法 索引
算法与数据结构
算法与数据结构
38 8
|
2月前
|
算法
【初阶数据结构篇】二叉树算法题
二叉树是否对称,即左右子树是否对称.
|
2月前
|
存储 算法
【初阶数据结构篇】顺序表和链表算法题
此题可以先找到中间节点,然后把后半部分逆置,最近前后两部分一一比对,如果节点的值全部相同,则即为回文。
|
2月前
|
存储 缓存 算法
深入解析B树:数据结构、存储结构与算法优势
深入解析B树:数据结构、存储结构与算法优势
|
2月前
|
算法
【算法】递归总结:循环与递归的区别?递归与深搜的关系?
【算法】递归总结:循环与递归的区别?递归与深搜的关系?
下一篇
无影云桌面