当前位置: 首页 > 知识库问答 >
问题:

科特林二叉树中最长的曲折路径

逑景铄
2023-03-14

我试图用kotlin中的递归来回答leetcode上二叉树中最长的曲折路径。输入如下所示

[1,null,1,1,1,null,null,1,1,null,1,null,null,null,1,null,1]

并表示二叉树。我遇到的问题与递归有关,我当前的代码在访问树中的所有节点后返回 1。但我打算让代码在每个树节点命中后添加 1 并将其添加到该锯齿形总数中。

left += traverseDirection(root?.left, "left")
right += traverseDirection(root?.right, "right")

左和右仅表示每个路径侧的相应之字形。我想知道的是,如何在每次递归调用后以println语句的方式添加这些值

/**
 * Example:
 * var ti = TreeNode(5)
 * var v = ti.`val`
 * Definition for a binary tree node.
 * class TreeNode(var `val`: Int) {
 *     var left: TreeNode? = null
 *     var right: TreeNode? = null
 * }
 */
class Solution {
    fun longestZigZag(root: TreeNode?): Int {
        var left: Int = 0
        var right: Int = 0
        
        left += traverseDirection(root?.left, "left")
        right += traverseDirection(root?.right, "right")
    
        return maxOf(left, right)
    }
    fun traverseDirection(root: TreeNode?, direction: String): Int {
        if (direction == "left" && root?.left == null){
           return 0
        }
        
        if (direction == "right" && root?.right == null){
           return 0
        }
        
        var current = root
        
        if (direction == "left"){
            current = root?.left
            traverseDirection(current, "right")
            println("add 1")
            return 1 
        }
        
        if (direction == "right"){
            current = root?.right
            traverseDirection(current, "left")
            println("add 1")
            return 1
        }
        
        return 0
    }
}

共有1个答案

尤祖鹤
2023-03-14

我无法轻松运行您的代码来验证这一点,但我相信您需要替换它:

traverseDirection(current, "right")
return 1 

有了这个:

return traverseDirection(current, "right") + 1

“左”倾路线也是如此。

此外,我认为只有从根部开始,你的解决方案才能找到最长的之字形。您必须为树中的每个节点运行longestZigZag()并找到最大值。这将为您提供一个O(n²)复杂度的简单解决方案。

 类似资料:
  • 如何在二叉树中找到最小路径和,并打印路径?路径可以从ROOT节点到任何LEAF节点。我已经编写了C代码来查找最小和,但是在打印路径时遇到了问题。 参数列表中的未使用,有人能帮我打印路径和最小的路径吗?

  • 我很难找到使用递归函数查找搜索二叉树的最长路径的代码。 bst_node是搜索二叉树的节点。 退出递归的条件非常简单: 在进行递归之前,打印节点的值: 如果假设深度x处的节点只有一个左子节点,那么最长路径穿过节点的左子节点,通过使用递归,我们可以这样写: 如果深度x处的节点只有右子节点,则最长路径穿过节点的右子节点,通过使用递归,我们可以像这样编写它 但是,如果节点同时具有左子项和右子项怎么办?我

  • 这道题是 LeetCode 124 题。 给定一个非空二叉树,返回其最大路径和。注意,这里的“路径”并非自顶向下的单向路径,而是二叉树中任意连通的路径,可以在任一节点开始和结束。比如对于下图的二叉树,10->12->9 是一个最大路径: -9 / \ 1 12 / \ 10 9 分析 首先定义“端点”的概念。一条路径有两个端点:起点和终点。比如上述示例中,

  • 本文向大家介绍二叉树任意两个节点之间路径的最大长度?相关面试题,主要包含被问及二叉树任意两个节点之间路径的最大长度?时的应答技巧和注意事项,需要的朋友参考一下 考察点:树    

  • 试图计算二叉树中从根到叶的路径和。似乎不起作用,doesIt的值变为true,但由于它是递归的,所以当堆栈弹出时,它会切换回false。我不知道怎么修。如何更改代码,使doesIt的值更改为true后,它会一直向上传播? 考虑树:[5,4,8,11, null, null, null,7,2]无序 5有两个孩子4和8,4有一个孩子11,8没有孩子 hasPathSum(根,22)

  • 我将完整子树定义为所有级别都已满且最后一个级别左对齐的树,即所有节点都尽可能左对齐,我希望找到树中最大的完整子树。 一种方法是对每个节点作为根执行这里概述的方法,这将花费O(n^2)时间。 有更好的方法吗?