Advertisement
_ums_

final B

Feb 29th, 2024
887
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 4.00 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4.     "fmt"
  5.     "io/ioutil"
  6.     "sort"
  7.     "strconv"
  8.     "strings"
  9. )
  10.  
  11. type Node struct {
  12.     value int
  13.     left  *Node
  14.     right *Node
  15. }
  16.  
  17. type tTmpStore struct {
  18.     leftIndex  int
  19.     rightIndex int
  20. }
  21.  
  22. func slice2BinaryTree(ss []string, n int) (*Node, []int) {
  23.     if len(ss) == 0 {
  24.         return nil, nil
  25.     }
  26.     var allKeys []int
  27.     myset := make(map[int]bool)
  28.     list := make([]*Node, n)
  29.     m := make(map[int]tTmpStore, n)
  30.     for i := 0; i < n; i++ {
  31.         ss[i] = strings.TrimSpace(ss[i])
  32.         if ss[i] == "" {
  33.             continue
  34.         }
  35.  
  36.         tmp := strings.Split(ss[i], " ")
  37.         if len(tmp) < 4 {
  38.             panic("wrong tree data '" + ss[i] + "'")
  39.         }
  40.  
  41.         list[i] = &Node{}
  42.         list[i].value, _ = strconv.Atoi(tmp[1])
  43.         myset[list[i].value] = true
  44.         ts := tTmpStore{}
  45.         if tmp[2] != "-1" {
  46.             ts.leftIndex, _ = strconv.Atoi(tmp[2])
  47.         }
  48.         if tmp[3] != "-1" {
  49.             ts.rightIndex, _ = strconv.Atoi(tmp[3])
  50.         }
  51.  
  52.         m[i] = ts
  53.     }
  54.     for key, _ := range myset {
  55.         allKeys = append(allKeys, key)
  56.     }
  57.     sort.Ints(allKeys)
  58.  
  59.     for i := 0; i < n; i++ {
  60.         ts := m[i]
  61.         if ts.leftIndex != 0 {
  62.             list[i].left = list[ts.leftIndex-1]
  63.         }
  64.         if ts.rightIndex != 0 {
  65.             list[i].right = list[ts.rightIndex-1]
  66.         }
  67.     }
  68.  
  69.     return list[0], allKeys
  70. }
  71.  
  72. func checkCorrectBst(tree *Node, allKeys map[int]bool) int {
  73.     if tree == nil {
  74.         return 0
  75.     }
  76.     if allKeys[tree.value] != true {
  77.         panic("Unknown key")
  78.     }
  79.     size := 1
  80.  
  81.     if tree.left != nil {
  82.         if tree.left.value > tree.value {
  83.             panic("Left child is bigger than its parent")
  84.         }
  85.         size += checkCorrectBst(tree.left, allKeys)
  86.     }
  87.     if tree.right != nil {
  88.         if tree.right.value < tree.value {
  89.             panic("Right child is smaller than its parent")
  90.         }
  91.         size += checkCorrectBst(tree.right, allKeys)
  92.     }
  93.     return size
  94. }
  95.  
  96. // through input.txt
  97. func main() {
  98.     bs, err := ioutil.ReadFile("input.txt")
  99.     if err != nil {
  100.         panic(err)
  101.     }
  102.  
  103.     ss := strings.Split(string(bs), "\n")
  104.     if len(ss) < 2 {
  105.         panic("wrong input")
  106.     }
  107.     test_type := ss[0]
  108.     n, _ := strconv.Atoi(ss[1])
  109.     tree := &Node{}
  110.     tree = nil
  111.     allKeys := make([]int, 0)
  112.     if n > 0 {
  113.         tree, allKeys = slice2BinaryTree(ss[2:], n)
  114.     }
  115.     if test_type == "correctness" {
  116.         toRemove, _ := strconv.Atoi(ss[n+2])
  117.         tree = remove(tree, toRemove)
  118.         myset := make(map[int]bool)
  119.         expectedSize := len(allKeys)
  120.  
  121.         for _, key := range allKeys {
  122.             myset[key] = true
  123.             if key == toRemove {
  124.                 expectedSize -= 1
  125.             }
  126.         }
  127.         actualSize := checkCorrectBst(tree, myset)
  128.         if actualSize != expectedSize {
  129.             panic("Size of Bst does not match with the answer")
  130.         }
  131.         fmt.Println("Correct")
  132.     } else {
  133.         for _, key := range allKeys {
  134.             tree = remove(tree, key)
  135.         }
  136.         if tree != nil {
  137.             fmt.Println("FAIL: non-null")
  138.         } else {
  139.             fmt.Println("OK: null")
  140.         }
  141.     }
  142. }
  143.  
  144. func remove(node *Node, key int) *Node {
  145.  
  146.     // если дерево пустое
  147.     if node == nil {
  148.         return nil
  149.     }
  150.  
  151.     deletedNode, prev := findNode(node, nil, key)
  152.  
  153.     if deletedNode == nil {
  154.         return node
  155.     }
  156.  
  157.     if deletedNode.right == nil || deletedNode.left == nil {
  158.         var newNode *Node
  159.  
  160.         if deletedNode.left == nil {
  161.             newNode = deletedNode.right
  162.         } else {
  163.             newNode = deletedNode.left
  164.         }
  165.  
  166.         if prev == nil {
  167.             return newNode
  168.         }
  169.  
  170.         if deletedNode == prev.left {
  171.             prev.left = newNode
  172.         } else {
  173.             prev.right = newNode
  174.         }
  175.  
  176.         deletedNode = nil
  177.     } else {
  178.  
  179.         leftMaxNode, prevLeftMaxNode := findLeftMaxNode(deletedNode.left, deletedNode)
  180.         deletedNode.value = leftMaxNode.value
  181.         prevLeftMaxNode.right = nil
  182.         leftMaxNode = nil
  183.     }
  184.  
  185.     return node
  186. }
  187.  
  188. func findNode(root *Node, prev *Node, value int) (*Node, *Node) {
  189.     if root == nil {
  190.         return nil, nil
  191.     }
  192.  
  193.     if value < root.value {
  194.         return findNode(root.left, root, value)
  195.     }
  196.  
  197.     if value > root.value {
  198.         return findNode(root.right, root, value)
  199.     }
  200.  
  201.     var node *Node
  202.     if value == root.value {
  203.         node = root
  204.     }
  205.  
  206.     return node, prev
  207. }
  208.  
  209. func findLeftMaxNode(node, prev *Node) (*Node, *Node) {
  210.     root := node
  211.     for root.right != nil {
  212.         prev = root
  213.         root = root.right
  214.     }
  215.     return root, prev
  216. }
  217.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement