MST

星途 面试题库

面试题:Go递归函数处理树形结构

假设有一个用Go语言实现的简单树形结构,每个节点包含一个整数值和一个子节点切片。编写一个递归函数,用于计算树中所有节点值的总和,并阐述如何避免递归过程中的栈溢出问题。
49.3万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
package main

import "fmt"

// 定义树节点结构
type TreeNode struct {
    Value   int
    Children []*TreeNode
}

// 递归计算树中所有节点值的总和
func sumTree(root *TreeNode) int {
    if root == nil {
        return 0
    }
    sum := root.Value
    for _, child := range root.Children {
        sum += sumTree(child)
    }
    return sum
}

// 避免栈溢出可以采用迭代的方式,使用栈数据结构模拟递归过程
func sumTreeIterative(root *TreeNode) int {
    if root == nil {
        return 0
    }
    var sum int
    stack := []*TreeNode{root}
    for len(stack) > 0 {
        node := stack[len(stack)-1]
        stack = stack[:len(stack)-1]
        sum += node.Value
        for i := len(node.Children) - 1; i >= 0; i-- {
            stack = append(stack, node.Children[i])
        }
    }
    return sum
}

为避免递归过程中的栈溢出问题:

  1. 尾递归优化:在一些编程语言中,可以通过编译器的尾递归优化来解决栈溢出问题。但Go语言目前并不支持尾递归优化。
  2. 迭代方式:使用栈数据结构手动模拟递归过程,如上述sumTreeIterative函数,将节点压入栈中,模拟递归调用栈的行为,这样不会受到系统栈深度的限制。