noTree的traverse调用不是应该成为递归循环吗?

来源:4-1 结构体和方法

阿憨阿憨

2018-12-30

老师能不能解释一下, 这里调用traverse,不是应该成为递归回调的死循环吗?

是不是因为

//创建节点
type TradeNode struct {
	value       int
	left, right *TradeNode
}

//遍历节点内容
func (node *TradeNode) traverse() {
	if node == nil {
		return
	}
	node.left.traverse()
	node.print()
	node.right.traverse()
}

func main(){
	var root TradeNode
	//将节点的value设置为3
	root = TradeNode{value: 3}
	//将节点内存地址赋值给节点的左子树
	root.left = &TradeNode{}
	//将节点内存地址赋值给节点的右子树,同时赋值
	root.right = &TradeNode{5, nil, nil}
	root.right.left = new(TradeNode)
	root.left.right = CreateNode(2)
	root.right.left.setValue(4)

	root.traverse()
}
写回答

1回答

ccmouse

2019-01-07

我们看node.left.traverse()。node.left的值不是node本身,而是它的下一层。node.left.left是更下一层。一直这样递归下去最终会碰到有人left=nil,再继续就是调用了nil指针的traverse。那么我们一上来判断了如果node是空,那么要return。

于是又会一路return回去。

0
1
阿憨阿憨
非常感谢!
2019-01-13
共1条回复

Google资深工程师深度讲解Go语言 由浅入深掌握Go语言

语法+分布式爬虫实战 为转型工程师量身打造

5995 学习 · 1909 问题

查看课程