Невозможно обновить значение указателя внутри метода

#pointers #go

#указатели #Вперед

Вопрос:

Я реализую AVLTreeMap в Go, но у меня возникли некоторые проблемы со значениями, переданными в качестве указателей. Я пытаюсь обновить значение указателя узла, но его значение не будет сохраняться после функции.

В функции func (дерево *AVLTreeMap) поместите(ключ int, строка значения). Я могу изменить корневой узел дерева и могу распечатать его в главном. Однако, когда я передаю тот же корень функции func (node * Node) insertByKey(key int, строка значения) сразу после этого, значение не обновляется, и сохраняется только значение из put().

 package main

import (
    "bufio"
    "fmt"
    "os"
    "strconv"
    "strings"
    "io"
)

/* NODE */
type Node struct {
    key     int
    value   string
    left    *Node
    right   *Node
    height  int
}


/* TREE */
type AVLTreeMap struct {
    root *Node
}

func (tree *AVLTreeMap) get(key int) string {
    value := tree.root.lookupByKey(key)
    if value == "" {
        return "Not Found"
    }

    return value
}

func (node *Node) inOrder() {
    fmt.Println(node)
    if (node != nil) {
        fmt.Println(node.key)

        node.left.inOrder()
        node.inOrder()
        node.right.inOrder()
    }
}

func (node *Node) lookupByKey(key int) string {

    if (node == nil) {                  // check for nullptr
        return ""

    } else if (node.key == key) {       // key matching
        return node.value

    } else if (key < node.left.key) {   // recur left
        return node.left.lookupByKey(key)

    } else if (key > node.right.key) {  // recur right
        return node.right.lookupByKey(key)
    } 

    return ""
}

func (node *Node) insertByKey(key int, value string)  {

    if (node == nil) {                  // check for nullptr
        node = amp;Node{ key: key, value: value,}

    } else if (key < node.key) {   // recur left
        node.left.insertByKey(key, value)

    } else if (key > node.key) {  // recur right
        node.right.insertByKey(key, value)
    }
}

func (tree *AVLTreeMap) put(key int, value string) {
    //fmt.Println(tree.root)
    tree.root = amp;Node{ key: 1, value: "2",}
    tree.root.insertByKey(key, value)
}

func (tree *AVLTreeMap) remove(key int) {
    return
}

func (tree *AVLTreeMap) levelOrder() {
    return
}

func (tree *AVLTreeMap) rotateLeft(curr *Node) *Node {
    return curr
}

func (tree *AVLTreeMap) rotateRight(curr *Node) *Node {
    return curr
}

func (tree *AVLTreeMap) getHeight(curr *Node) int {
    return 1
}

func (tree *AVLTreeMap) getBalance(curr *Node) int {
    return 1
}

/* UTILS */
func checkError(err error) {
    if err != nil {
        panic(err)
    }
}

func strToInt(val string) int {
    if val, err := strconv.Atoi(val); err == nil {
        return val   
    }

    return 0
}

func readLine(reader *bufio.Reader) string {
    str, _, err := reader.ReadLine()
    if err == io.EOF {
        return ""
    }

    return strings.TrimRight(string(str), "rn")
}

func getCommand(command string, tree *AVLTreeMap) {

    vals := strings.Split(command, " ")
    var (
        key int
        val string
    )

    if len(vals) == 1 {         // level order
        tree.levelOrder()

    } else if len(vals) == 3 {  // put
        key, val = strToInt(vals[1]), vals[2]
        tree.put(key, val)

    } else if len(vals) == 2 {  // get
        //key = strToInt(vals[1])
        //fmt.Println(tree.get(key)) 
    }
}

func main() {
    reader := bufio.NewReaderSize(os.Stdin, 16 * 1024 * 1024)

    // get num commands
    numCommands := strToInt(readLine(reader))
    fmt.Println(numCommands)

    // initialize new TreeMap
    tree := AVLTreeMap{}
    //tree.root = amp;Node{ key: 1, value: "z", }

    for {
        val := readLine(reader)
        if val == "" {
            break;
        } else {

            // run commands on tree
            getCommand(val, amp;tree)
        }
    }
    fmt.Println(tree.root)
    //tree.root.inOrder()
}
  

Комментарии:

1. Я не вижу вызова insertByKey после вызова put. Обновите код, чтобы показать последовательность вызовов функций, о которых вы спрашиваете, что происходит и чего вы ожидаете.

2. Пожалуйста, сократите свой код.