#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. Пожалуйста, сократите свой код.