Ладно. Я знаю, что вы точно спрашиваете в конце концов.
New()
методы возвращают значение, а не указатель, что означает, что вы не можете видеть более поздние изменения в вызывающей программе.То, что получил вызывающий объект, является только ценностной копией узла.Таким образом, родительский результат всегда будет {Left:<nil> Right:<nil> Value:2}
.
То же самое с addLeftNode()
и addRightNode()
.
Просто используйте указатель, а не значение для достижения своей цели.
См. pointers_vs_values
Я думаю, что проблема заключается только в Visit()
методе.
- Он никогда не будет посещать правого ребенка, когда вы сразу же вернетесь после посещения левого ребенка.
- Левый и правый дочерние элементы не являются взаимоисключающими, поэтому второе условие if не должно использовать
else if
, что будет if
. - В заказе на посещение также есть проблемы.
До:
// Visit will automatically walk through the Child Nodes of the accessed Parent Node.
func (parent *Node) Visit() (Node, int) {
fmt.Println("Node value:", parent.Value)
if parent.hasLeftNode() {
return parent.Left.Visit()
} else if parent.hasRightNode() {
return parent.Right.Visit()
}
return *parent, parent.Value
}
Изменено:
// Visit will automatically walk through the Child Nodes of the accessed Parent Node.
func (parent *Node) Visit() (Node, int) {
if parent.hasLeftNode() {
parent.Left.Visit()
}
fmt.Println("Node value:", parent.Value)
if parent.hasRightNode() {
parent.Right.Visit()
}
return *parent, parent.Value
}
Кроме того, для меня Visit()
не должно возвращать никаких значений.