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