mirror of https://github.com/01-edu/public.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
181 lines
3.6 KiB
181 lines
3.6 KiB
package correct |
|
|
|
import ( |
|
"fmt" |
|
"io" |
|
"math/rand" |
|
"strconv" |
|
) |
|
|
|
type TNode struct { |
|
Val int |
|
Left *TNode |
|
Right *TNode |
|
} |
|
|
|
func Invert(root *TNode) { |
|
if root != nil { |
|
temp := root.Left |
|
root.Left = root.Right |
|
root.Right = temp |
|
|
|
Invert(root.Left) |
|
Invert(root.Right) |
|
} |
|
} |
|
|
|
func InvertTree(root *TNode) *TNode { |
|
Invert(root) |
|
return root |
|
} |
|
|
|
type stuNode = TNode |
|
type solNode = correct.TNode |
|
|
|
func solInsert(N *solNode, newVal int) { |
|
if N == nil { |
|
return |
|
} |
|
if newVal <= N.Val { |
|
if N.Left == nil { |
|
N.Left = &solNode{Val: newVal, Left: nil, Right: nil} |
|
} else { |
|
solInsert(N.Left, newVal) |
|
} |
|
} else { |
|
if N.Right == nil { |
|
N.Right = &solNode{Val: newVal, Left: nil, Right: nil} |
|
} else { |
|
solInsert(N.Right, newVal) |
|
} |
|
} |
|
} |
|
|
|
func stuInsert(N *stuNode, newVal int) { |
|
if N == nil { |
|
return |
|
} |
|
if newVal <= N.Val { |
|
if N.Left == nil { |
|
N.Left = &stuNode{Val: newVal, Left: nil, Right: nil} |
|
} else { |
|
stuInsert(N.Left, newVal) |
|
} |
|
} else { |
|
if N.Right == nil { |
|
N.Right = &stuNode{Val: newVal, Left: nil, Right: nil} |
|
} else { |
|
stuInsert(N.Right, newVal) |
|
} |
|
} |
|
} |
|
|
|
func IsIdentical(root1 *solNode, root2 *stuNode) bool { |
|
if root1 == nil && root2 == nil { |
|
return true |
|
} |
|
if root1 == nil && root2 != nil { |
|
return false |
|
} |
|
if root2 == nil && root1 != nil { |
|
return false |
|
} |
|
return root1.Val == root2.Val && IsIdentical(root1.Left, root2.Left) && IsIdentical(root1.Right, root2.Right) |
|
} |
|
|
|
func stuPrint(w io.Writer, node *stuNode, ns int, ch rune) { |
|
if node == nil { |
|
return |
|
} |
|
|
|
for i := 0; i < ns; i++ { |
|
fmt.Fprint(w, " ") |
|
} |
|
fmt.Fprintf(w, "%c:%v\n", ch, node.Val) |
|
stuPrint(w, node.Left, ns+2, 'L') |
|
stuPrint(w, node.Right, ns+2, 'R') |
|
} |
|
|
|
func solPrint(w io.Writer, node *solNode, ns int, ch rune) { |
|
if node == nil { |
|
return |
|
} |
|
|
|
for i := 0; i < ns; i++ { |
|
fmt.Fprint(w, " ") |
|
} |
|
fmt.Fprintf(w, "%c:%v\n", ch, node.Val) |
|
solPrint(w, node.Left, ns+2, 'L') |
|
solPrint(w, node.Right, ns+2, 'R') |
|
} |
|
|
|
func returnStuTree(root *stuNode) string { |
|
if root == nil { |
|
return "" |
|
} |
|
ans := strconv.Itoa(root.Val) |
|
if root.Left == nil && root.Right == nil { |
|
return ans |
|
} |
|
if root.Left != nil { |
|
ans += " " + returnStuTree(root.Left) |
|
} |
|
if root.Right != nil { |
|
ans += " " + returnStuTree(root.Right) |
|
} |
|
return ans |
|
} |
|
|
|
func returnSolTree(root *solNode) string { |
|
if root == nil { |
|
return "" |
|
} |
|
ans := strconv.Itoa(root.Val) |
|
if root.Left == nil && root.Right == nil { |
|
return ans |
|
} |
|
if root.Left != nil { |
|
ans += " " + returnSolTree(root.Left) |
|
} |
|
if root.Right != nil { |
|
ans += " " + returnSolTree(root.Right) |
|
} |
|
return ans |
|
} |
|
|
|
func main() { |
|
root, val1, val2, val3, val4 := 0, 0, 0, 0, 0 |
|
|
|
root = rand.Intn(30) |
|
tree := &solNode{Val: root, Left: nil, Right: nil} |
|
TestTree := &stuNode{Val: root, Left: nil, Right: nil} |
|
for i := 0; i < 15; i++ { |
|
tree = &solNode{Val: root, Left: nil, Right: nil} |
|
temp := tree |
|
val1, val2, val3, val4 = rand.Intn(30), rand.Intn(30), rand.Intn(30), rand.Intn(30) |
|
solInsert(tree, val1) |
|
solInsert(tree, val2) |
|
solInsert(tree, val3) |
|
solInsert(tree, val4) |
|
// solPrint(os.Stdout, tree, 0, 'M') |
|
correct.InvertTree(tree) |
|
// solPrint(os.Stdout, tree, 0, 'M') |
|
|
|
TestTree = &stuNode{Val: root, Left: nil, Right: nil} |
|
tmp := TestTree |
|
stuInsert(TestTree, val1) |
|
stuInsert(TestTree, val2) |
|
stuInsert(TestTree, val3) |
|
stuInsert(TestTree, val4) |
|
// stuPrint(os.Stdout, TestTree, 0, 'M') |
|
InvertTree(TestTree) |
|
// stuPrint(os.Stdout, TestTree, 0, 'M') |
|
|
|
if !IsIdentical(tree, TestTree) { |
|
tree1 := returnSolTree(temp) |
|
tree2 := returnStuTree(tmp) |
|
lib.Fatalf("\n\"%v\" instead of \"%v\"\n\n", tree1, tree2) |
|
// lib.Fatalf("\nError\n\n") |
|
} |
|
} |
|
}
|
|
|