华为OD机试真题B卷 Java 实现【二叉树的所有路径】,附详细解题思路

在这里插入图片描述

一、题目描述

给定一个二叉树,返回所有从根节点到叶子节点的路径。
说明: 叶子节点是指没有子节点的节点。

二、思路与算法

最直观的方法是使用深度优先搜索。在深度优先搜索遍历二叉树时,我们需要考虑当前的节点以及它的孩子节点。
如果当前节点不是叶子节点,则在当前的路径末尾添加该节点,并继续递归遍历该节点的每一个孩子节点。
如果当前节点是叶子节点,则在当前路径末尾添加该节点后我们就得到了一条从根节点到叶子节点的路径,将该路径加入到答案即可。
如此,当遍历完整棵二叉树以后我们就得到了所有从根节点到叶子节点的路径。

四、解题思路

最直观的方法是使用深度优先搜索。在深度优先搜索遍历二叉树时,我们需要考虑当前的节点以及它的孩子节点。
如果当前节点不是叶子节点,则在当前的路径末尾添加该节点,并继续递归遍历该节点的每一个孩子节点。
如果当前节点是叶子节点,则在当前路径末尾添加该节点后我们就得到了一条从根节点到叶子节点的路径,将该路径加入到答案即可。
如此,当遍历完整棵二叉树以后我们就得到了所有从根节点到叶子节点的路径。

五、Java算法源码

public List<String> binaryTreePaths(TreeNode root) {
    List<String> list = new ArrayList<>();
    constructPaths(root, "", list);
    return list;
}
 
private void constructPaths(TreeNode root, String path, List<String> pathList){
    if (root != null){
        StringBuilder builder = new StringBuilder(path);
        builder.append(Integer.toString(root.val));
        if (root.left == null && root.right == null){//当前节点是叶子节点
            pathList.add(builder.toString()); //把路径加入到答案中
        }else {
            builder.append("->");//当前结点不是叶子结点,继续递归遍历
            constructPaths(root.left, builder.toString(),pathList);
            constructPaths(root.right, builder.toString(),pathList);
        }
    }
}

六、进阶写法可以使用栈来实现深度优先搜索

具体步骤如下:

  1. 将根节点压入栈中,同时将根节点对应的路径保存到另一个栈中;
  2. 当栈非空时,弹出栈顶节点以及对应的路径,并检查该节点是否为叶子节点;
  3. 如果是叶子节点,则将路径添加到结果列表中;
  4. 如果不是叶子节点,则将节点的孩子节点和对应的路径分别压入栈中。
public List<String> binaryTreePaths(TreeNode root) {
    List<String> list = new ArrayList<>();
    if (root == null) {
        return list;
    }
    Stack<TreeNode> nodeStack = new Stack<>();
    Stack<String> pathStack = new Stack<>();
    nodeStack.push(root);
    pathStack.push(Integer.toString(root.val));
    while (!nodeStack.isEmpty()) {
        TreeNode node = nodeStack.pop();
        String path = pathStack.pop();
        if (node.left == null && node.right == null) { // 叶子节点
            list.add(path);
        } else {
            if (node.right != null) {
                nodeStack.push(node.right);
                pathStack.push(path + "->" + Integer.toString(node.right.val));
            }
            if (node.left != null) {
                nodeStack.push(node.left);
                pathStack.push(path + "->" + Integer.toString(node.left.val));
            }
        }
    }
    return list;
}

下一篇:华为OD机试真题 Java 实现【跳房子II】【2023 B卷 100分】,附详细解题思路

本文收录于,华为OD机试(JAVA)(2022&2023)

本专栏包含了最新最全的2023年华为OD机试真题,有详细的分析和Java解答。已帮助1000+同学顺利通过OD机考。专栏会持续更新,每天在线答疑。

在这里插入图片描述

你可能感兴趣的:(搬砖工逆袭Java架构师,java,华为od,算法,学习,开发语言)