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.
121 lines
2.6 KiB
121 lines
2.6 KiB
5 years ago
|
package main
|
||
5 years ago
|
|
||
|
import (
|
||
|
"github.com/01-edu/z01"
|
||
|
|
||
|
solutions "./solutions"
|
||
|
student "./student"
|
||
|
)
|
||
|
|
||
|
func parentListDelete(root *student.TreeNode) string {
|
||
|
if root == nil {
|
||
|
return ""
|
||
|
}
|
||
|
|
||
|
var parent string
|
||
|
|
||
|
if root.Parent == nil {
|
||
|
parent = "nil"
|
||
|
} else {
|
||
|
parent = root.Parent.Data
|
||
|
}
|
||
|
|
||
|
r := "Node: " + root.Data + " Parent: " + parent + "\n"
|
||
|
r += parentListDelete(root.Left) + parentListDelete(root.Right)
|
||
|
return r
|
||
|
}
|
||
|
|
||
|
func FormatTree_delete(root *student.TreeNode) string {
|
||
|
if root == nil {
|
||
|
return ""
|
||
|
}
|
||
|
res := root.Data + "\n"
|
||
|
res += formatSubTree_delete(root, "")
|
||
|
return res
|
||
|
}
|
||
|
|
||
|
func formatSubTree_delete(root *student.TreeNode, prefix string) string {
|
||
|
if root == nil {
|
||
|
return ""
|
||
|
}
|
||
|
|
||
|
var res string
|
||
|
|
||
|
hasLeft := root.Left != nil
|
||
|
hasRight := root.Right != nil
|
||
|
|
||
|
if !hasLeft && !hasRight {
|
||
|
return res
|
||
|
}
|
||
|
|
||
|
res += prefix
|
||
|
if hasLeft && hasRight {
|
||
|
res += "├── "
|
||
|
}
|
||
|
|
||
|
if !hasLeft && hasRight {
|
||
|
res += "└── "
|
||
|
}
|
||
|
|
||
|
if hasRight {
|
||
|
printStrand := (hasLeft && hasRight && (root.Right.Right != nil || root.Right.Left != nil))
|
||
|
newPrefix := prefix
|
||
|
if printStrand {
|
||
|
newPrefix += "│ "
|
||
|
} else {
|
||
|
newPrefix += " "
|
||
|
}
|
||
|
res += root.Right.Data + "\n"
|
||
|
res += formatSubTree_delete(root.Right, newPrefix)
|
||
|
}
|
||
|
|
||
|
if hasLeft {
|
||
|
if hasRight {
|
||
|
res += prefix
|
||
|
}
|
||
|
res += "└── " + root.Left.Data + "\n"
|
||
|
res += formatSubTree_delete(root.Left, prefix+" ")
|
||
|
}
|
||
|
return res
|
||
|
}
|
||
|
|
||
5 years ago
|
func errorMessage_delete(fn interface{}, deleted string, rootOr, root *solutions.TreeNode, rootS *student.TreeNode) {
|
||
|
z01.Fatalf("%s(\n%s, %s\n) ==\n%s instead of\n%s\n",
|
||
|
"BTreeDeleteNode",
|
||
5 years ago
|
solutions.FormatTree(rootOr),
|
||
|
deleted,
|
||
|
FormatTree_delete(rootS),
|
||
|
solutions.FormatTree(root),
|
||
|
)
|
||
|
}
|
||
|
|
||
5 years ago
|
func CompareTrees_delete(fn interface{}, deleted string, rootOr, root *solutions.TreeNode, rootS *student.TreeNode) {
|
||
5 years ago
|
sel := student.BTreeSearchItem(rootS, deleted)
|
||
|
|
||
|
if !student.BTreeIsBinary(rootS) || sel != nil {
|
||
5 years ago
|
errorMessage_delete(fn, deleted, rootOr, root, rootS)
|
||
5 years ago
|
}
|
||
|
}
|
||
|
|
||
5 years ago
|
func main() {
|
||
5 years ago
|
root := &solutions.TreeNode{Data: "04"}
|
||
|
rootS := &student.TreeNode{Data: "04"}
|
||
|
rootOr := &solutions.TreeNode{Data: "04"}
|
||
|
|
||
|
ins := []string{"01", "07", "05", "12", "02", "03", "10"}
|
||
|
|
||
|
for _, v := range ins {
|
||
|
root = solutions.BTreeInsertData(root, v)
|
||
|
rootS = student.BTreeInsertData(rootS, v)
|
||
|
rootOr = solutions.BTreeInsertData(rootOr, v)
|
||
|
}
|
||
|
|
||
|
selected := solutions.BTreeSearchItem(root, "04")
|
||
|
selectedS := student.BTreeSearchItem(rootS, "04")
|
||
|
|
||
|
root = solutions.BTreeDeleteNode(root, selected)
|
||
|
rootS = student.BTreeDeleteNode(rootS, selectedS)
|
||
|
fn := interface{}(solutions.BTreeDeleteNode)
|
||
5 years ago
|
CompareTrees_delete(fn, selected.Data, rootOr, root, rootS)
|
||
5 years ago
|
}
|