脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服务器之家 - 脚本之家 - Golang - Go Java算法之二叉树的所有路径示例详解

Go Java算法之二叉树的所有路径示例详解

2022-11-09 11:38黄丫丫 Golang

这篇文章主要为大家介绍了Go Java算法之二叉树的所有路径示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

二叉树的所有路径

给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。

叶子节点 是指没有子节点的节点。  

  • 示例 1:

输入:root = [1,2,3,null,5]

输出:["1->2->5","1->3"]

  • 示例 2:

输入:root = [1]

输出:["1"]  

提示:

树中节点的数目在范围 [1, 100] 内

-100 <= Node.val <= 100

方法一:深度优先遍历搜索(Java)

最直观的方法是使用深度优先搜索。在深度优先搜索遍历二叉树时,我们需要考虑当前的节点以及它的孩子节点。

如果当前节点不是叶子节点,则在当前的路径末尾添加该节点,并继续递归遍历该节点的每一个孩子节点。

如果当前节点是叶子节点,则在当前路径末尾添加该节点后我们就得到了一条从根节点到叶子节点的路径,将该路径加入到答案即可。

递归二步曲:

(1) 找出重复的子问题。

  • 前序遍历的顺序是:根节点、左子树、右子树。
  • 在本题同样也是这个顺序:将根节点加入路径,递归左子树,递归右子树。
  • 对于左子树和右子树来说,也都是同样的操作。

(2) 确定终止条件。

对于二叉树的所有路径中的每条路径,当遍历到叶子节点的时候为当前路径的结束。并且将当前路径加入结果集。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Solution {
    public List<String> binaryTreePaths(TreeNode root) {
        List<String> paths = new ArrayList<String>();
        constructPaths(root, "", paths);
        return paths;
    }
    public void constructPaths(TreeNode root, String path, List<String> paths) {
        if (root != null) {
            StringBuffer pathSB = new StringBuffer(path);
            pathSB.append(Integer.toString(root.val));
            if (root.left == null && root.right == null) {  // 当前节点是叶子节点
                paths.add(pathSB.toString());  // 把路径加入到答案中
            } else {
                pathSB.append("->");  // 当前节点不是叶子节点,继续递归遍历
                constructPaths(root.left, pathSB.toString(), paths);
                constructPaths(root.right, pathSB.toString(), paths);
            }
        }
    }
}

时间复杂度:O(N^2)

空间复杂度:O(N^2)

方法二:广度优先遍历(Go)

我们也可以用广度优先搜索来实现。

  • 我们维护一个队列,存储节点以及根到该节点的路径。一开始这个队列里只有根节点。
  • 在每一步迭代中,我们取出队列中的首节点
  • 如果它是叶子节点,则将它对应的路径加入到答案中。如果它不是叶子节点,则将它的所有孩子节点加入到队列的末尾。
  • 当队列为空时广度优先搜索结束
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
func binaryTreePaths(root *TreeNode) []string {
    paths := []string{}
    if root == nil {
        return paths
    }
    nodeQueue := []*TreeNode{}
    pathQueue := []string{}
    nodeQueue = append(nodeQueue, root)
    pathQueue = append(pathQueue, strconv.Itoa(root.Val))
    for i := 0; i < len(nodeQueue); i++ {
        node, path := nodeQueue[i], pathQueue[i]
        if node.Left == nil && node.Right == nil {
            paths = append(paths, path)
            continue
        }
        if node.Left != nil {
            nodeQueue = append(nodeQueue, node.Left)
            pathQueue = append(pathQueue, path + "->" + strconv.Itoa(node.Left.Val))
        }
        if node.Right != nil {
            nodeQueue = append(nodeQueue, node.Right)
            pathQueue = append(pathQueue, path + "->" + strconv.Itoa(node.Right.Val))
        }
    }
    return paths
}

时间复杂度:O(N^2)

空间复杂度:O(N^2)

以上就是Go Java算法之二叉树的所有路径示例详解的详细内容,更多关于Go Java算法二叉树所有路径的资料请关注服务器之家其它相关文章!

原文链接:https://juejin.cn/post/7132868080128458782

延伸 · 阅读

精彩推荐
  • Golang使用go module导入本地包的方法教程详解

    使用go module导入本地包的方法教程详解

    go module 将是Go语言默认的依赖管理工具。到今天 Go1.14 版本推出之后 Go modules 功能已经被正式推荐在生产环境下使用了。本文重点给大家介绍如何使用 go ...

    Golang教程网14472020-06-06
  • Golanggolang实现多协程下载文件(支持断点续传)

    golang实现多协程下载文件(支持断点续传)

    本文主要介绍了golang实现多协程下载文件,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    山与路10192021-12-02
  • Golang手把手带你走进Go语言之语法基础解析

    手把手带你走进Go语言之语法基础解析

    这篇文章主要介绍了手把手带你走进Go语言之语法基础,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考...

    我是小白呀10922021-09-19
  • GolangGo语言生成随机数的方法

    Go语言生成随机数的方法

    这篇文章主要介绍了Go语言生成随机数的方法,实例分析了Go语言生成随机数的原理与实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下 ...

    不吃皮蛋3422020-04-14
  • Golanggo如何利用orm简单实现接口分布式锁

    go如何利用orm简单实现接口分布式锁

    本篇文章主要介绍了go如何利用orm简单实现接口分布式锁,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧 ...

    zx2842020-05-17
  • Golang浅谈golang 的高效编码细节

    浅谈golang 的高效编码细节

    本文主要介绍了golang 的高效编码细节,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    小魔童哪吒11212021-11-23
  • GolangGO语言中常见的排序算法使用示例

    GO语言中常见的排序算法使用示例

    这篇文章主要为大家介绍了GO语言中常见排序算法的使用示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪...

    Jeff的技术栈4042022-09-14
  • Golanggolang实现PHP数组特性的方法

    golang实现PHP数组特性的方法

    我们做业务过程中,对应强类型语言使用有个痛点,就是使用变量之前一定要定义变量类型,那么本文就来介绍一下golang实现PHP数组特性的方法...

    万般皆下品惟有读书高11272022-01-26