二叉树路径与回溯法

简介: 文章通过LeetCode第257题"二叉树路径"的解题过程,详细阐述了如何利用前序遍历和回溯法来找出二叉树中所有从根节点到叶子节点的路径,并提供了Java语言的代码实现,强调了回溯法在解决类似问题中的重要性。

前言

算法是计算机软件的基础,常见算法是软件开发的核心基本功,今年打算深入学习一些算法,记录一些算法理论以及最佳实践,希望可以坚持下去,关注我,我们一起学习,增强我们的基本功。

二叉树的路径

leetcode第257题需要查找二叉树的所有路径。

image.png

二叉树的路径就是根节点到每个叶子节点之间的路径。

我们只要使用前序遍历,每次遍历到叶子节点的时候收集一次路径,直到遍历到最后一个叶子节点,所有路径都可以收集完成。

比如下方二叉树,总共有3条路径

image.png

路径1: 8 5 3

路径2: 8 5 6,我们可以发现求路径2的时候,我们只要回到5这个节点,再遍历右节点6就可以得到路径2,这就是回溯的过程。

路径3: 8 9, 我们可以发现求路径3的时候,我们只要回到8这个节点,再遍历右节点9就可以得到路径3,这也是回溯的过程。

编码求二叉树的路径

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
   
   
    List<String> result = new ArrayList<>();
    public List<String> binaryTreePaths(TreeNode root) {
   
   
        List<Integer> subResult = new ArrayList<>();
        binaryTreePaths2(root, subResult);
        return result;
    }

    //递归和回溯求解二叉树路径
    public void  binaryTreePaths2(TreeNode root, List<Integer> subResult) {
   
   
        //前序遍历,按中左右顺序遍历
        subResult.add(root.val);
        if(root.left == null && root.right == null) {
   
   
            String r = "";
            for(int i=0; i<subResult.size(); i++) {
   
   
                if(i>0) {
   
   
                    r = r + "->" + subResult.get(i);
                } else {
   
   
                    r += subResult.get(i);
                }

            }
            result.add(r);
            return;
        }
        //遍历左子树
        if(root.left != null) {
   
   
            binaryTreePaths2(root.left, subResult);
            //这里其实就是回溯
            subResult.remove(subResult.size()-1);
        }
        //遍历右子树
        if(root.right != null) {
   
   
            binaryTreePaths2(root.right, subResult);
            //这里其实就是回溯
            subResult.remove(subResult.size()-1);
        }

    }
}

总结

看完今天的题目,发现回溯和递归是一起出现的。回溯是回退部分递归走过的路径,再接着继续遍历其他节点。

看完上面的代码,再看看这张图,是不是更好理解回溯了。 image.png

嘿,既然看到这里了,关注我们,一起学习技术,一起变强。

image.png

相关文章
|
6月前
|
Java C++
leetcode-257:二叉树的所有路径
leetcode-257:二叉树的所有路径
35 0
【剑指offer】-二叉树中和为某一值的路径-24/67
【剑指offer】-二叉树中和为某一值的路径-24/67
17_二叉树的所有路径
17_二叉树的所有路径
|
25天前
【LeetCode 34】257.二叉树的所有路径
【LeetCode 34】257.二叉树的所有路径
11 0
|
算法
代码随想录Day14 LeetCodeT110平衡二叉树 T257二叉树的所有路径 T404 左叶子之和
代码随想录Day14 LeetCodeT110平衡二叉树 T257二叉树的所有路径 T404 左叶子之和
33 0
|
6月前
|
C++
二叉树的所有路径(C++)
二叉树的所有路径(C++)
47 1
|
6月前
leetcode-124. 二叉树中的最大路径和
leetcode-124. 二叉树中的最大路径和
32 0
|
12月前
|
存储 C++
C++二叉树的所有路径
C++二叉树的所有路径
剑指offer_二叉树---二叉树中和为某一值的路径
剑指offer_二叉树---二叉树中和为某一值的路径
77 0
剑指offer 35. 二叉树中和为某一值的路径
剑指offer 35. 二叉树中和为某一值的路径
55 0