

下記のコードを実行すると  
`panic: runtime error: invalid memory address or nil pointer
dereference`が発生します。  
これは、Insert()が返す*NodeのLeftがnilになっているからだと思うのですが、  
Node.Leftがnilにならないようにするにはどうすればいいのでしょうか?

[code]

    
    package main
    
    type Node struct {
        Value               int
        Left, Right, Parent *Node
    }
    
    func (n *Node) Insert(num int) *Node {
    
        if num > n.Value {
            n.Left.Value = num
            n.Left.Parent = n
        } else if num < n.Value {
            n.Right.Value = num
            n.Right.Parent = n
        }
        return n
    }
    
    func main() {
        root := &Node{Value: 1264523}
        root.Insert(222222)
    }
    
    
    
    
[/code]


CC BY-SA 3.0
2015-12-06T04:59:17.233
19672
2021-07-17T17:01:25.127
5246
question
go
Goでinvalid memory address or nil pointer dereferenceが発生する


`main` 関数で `root` 変数に `Node` 型構造体(へのポインタ)を代入しているのと同じ様に、`n.Left` と `n.Right` にも
`Node` 型構造体を割り当ててあげれば良いのではないでしょうか。

[code]

    func (n *Node) Insert(num int) *Node {
        if num > n.Value {
            n.Left = &Node{Value: num, Parent: n}
        } else if num < n.Value {
            n.Right = &Node{Value: num, Parent: n}
        }
        return n
    }
    
[/code]

ただ、新たに `Node` 型構造体を挿入する前に既に `n.Left` ノードや `n.Right`
ノードが存在する場合には、「ノードの付け替え」を行う必要がある様に思われます。


CC BY-SA 3.0
2015-12-06T05:22:45.227
19674
2015-12-06T05:22:45.227
19672
answer