Created
June 15, 2020 04:28
-
-
Save P-A-R-U-S/29db9ea88cf189e4a69c0c0da57e10e1 to your computer and use it in GitHub Desktop.
Cracking the Coding Interview - Task - 4.11 - Random Node, Insert Node, Delete Node
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package Part_4 | |
import ( | |
"fmt" | |
"math/rand" | |
"testing" | |
"time" | |
) | |
/* | |
Random Node: You are implementing a binary tree class from scratch which, in addition to insert, find, and delete, | |
has a method getRandomNode() which returns a random node from the tree. All nodes should be equally likely to be chosen. | |
Design and implement an algorithm for getRandomNode, and explain how you would implement the rest of the methods. | |
Hints: #42, #54, #62, #75, #89, #99, #7 72, #7 79 | |
*/ | |
/* | |
Вы пишете с нуля класс бинарного дерева поиска, который помимо методов вставки, | |
поиска и удаления содержит метод g e t R a n d o m N o d e ( ) для получения случайного узла дерева. | |
Вероятность выбора всех узлов должна быть одина ковой. | |
Разработайте и реализуйте алгоритм getRandomNode; объясните, как вы реализуете остальные методы. | |
*/ | |
type value int | |
type Node struct { | |
id value | |
left *Node | |
right *Node | |
} | |
type DeleteDirection int | |
const ( | |
MaxFromLeft DeleteDirection = iota | |
MinFromRight | |
) | |
func insertNode(root *Node, v value ) *Node { | |
n := &Node{id: v} | |
if root == nil { | |
return n | |
} | |
current_root := root | |
for { | |
if current_root.id < v { | |
if current_root.right == nil { | |
current_root.right = n | |
break | |
} | |
current_root = current_root.right | |
continue | |
} | |
if current_root.id > v { | |
if current_root.left == nil { | |
current_root.left = n | |
break | |
} | |
current_root = current_root.left | |
continue | |
} | |
} | |
return root | |
} | |
func deleteNode(root *Node, v value, deleteDirection DeleteDirection ) *Node { | |
if root == nil { | |
return nil | |
} | |
var parent_left, parent_right, node *Node | |
var s []*Node | |
visited := make(map[value]bool) | |
if root.id == v { | |
node = root | |
goto DELETENODE | |
} | |
s = append(s, root) | |
visited[root.id] = true | |
for len(s) > 0 { | |
n := s[len(s)-1] | |
s = s[:len(s)-1] | |
if n.left != nil { | |
if n.left.id == v { | |
node = n.left | |
parent_left = n | |
goto DELETENODE | |
} | |
if !visited[n.left.id] { | |
visited[n.left.id] = true | |
s = append(s, n.left) | |
} | |
} | |
if n.right != nil { | |
if n.right.id == v { | |
node = n.right | |
parent_right = n | |
goto DELETENODE | |
} | |
if !visited[n.right.id] { | |
visited[n.right.id] = true | |
s = append(s, n.right) | |
} | |
} | |
} | |
DELETENODE: | |
if node != nil { | |
// No child | |
if node.left == nil && node.right == nil { | |
// This is Root with no child | |
// just set root to nil | |
if parent_left == nil && parent_right == nil { | |
root = nil | |
goto END | |
} | |
if parent_right != nil { | |
parent_right.right = nil | |
} | |
if parent_left != node { | |
parent_left.left = nil | |
} | |
goto END | |
} | |
// One Child | |
// Node has Left child | |
if node.left != nil && node.right == nil { | |
if parent_left == nil && parent_right == nil { | |
root = nil | |
goto END | |
} | |
if parent_right != nil { | |
parent_right.right = node.left | |
node.left = nil | |
goto END | |
} | |
if parent_left != nil { | |
parent_left.left = node.left | |
node.left = nil | |
goto END | |
} | |
} | |
// Node has Right child | |
if node.left == nil && node.right != nil { | |
if parent_left == nil && parent_right == nil { | |
root = nil | |
goto END | |
} | |
if parent_right != nil { | |
parent_right.right = node.right | |
node.right = nil | |
goto END | |
} | |
if parent_left != nil { | |
parent_left.left = node.right | |
node.right = nil | |
goto END | |
} | |
} | |
//Two child | |
if node.left != nil && node.right != nil { | |
// Get Max from left | |
if deleteDirection == MaxFromLeft { | |
var prev_current_max *Node | |
current_max := node.left | |
for current_max.right != nil { | |
prev_current_max = current_max | |
current_max = current_max.right | |
} | |
//if current_max.left != nil { | |
if prev_current_max != nil { | |
prev_current_max.right = current_max.left | |
current_max.left = node.left | |
} | |
//} | |
if parent_left == nil && parent_right == nil { | |
root = current_max | |
} | |
if parent_left != nil && parent_right == nil { | |
parent_left.left = current_max | |
} | |
if parent_left == nil && parent_right != nil { | |
parent_right.right = current_max | |
} | |
current_max.right = node.right | |
node.right = nil | |
node.left = nil | |
goto END | |
} | |
//Get Min from right | |
if deleteDirection == MinFromRight { | |
var prev_current_min *Node | |
current_min := node.right | |
for current_min.left != nil { | |
prev_current_min = current_min | |
current_min = current_min.left | |
} | |
if prev_current_min != nil { | |
prev_current_min.left = current_min.right | |
current_min.right = node.right | |
} | |
if parent_left == nil && parent_right == nil { | |
root = current_min | |
} | |
if parent_left != nil && parent_right == nil { | |
parent_left.left = current_min | |
} | |
if parent_left == nil && parent_right != nil { | |
parent_right.right = current_min | |
} | |
current_min.left = node.left | |
node.right = nil | |
node.left = nil | |
goto END | |
} | |
} | |
} | |
END: | |
return root | |
} | |
func FindMin(root *Node) *Node { | |
//var prev_current_min *Node | |
current_min := root | |
for current_min.left != nil { | |
//prev_current_min = current_min | |
current_min = current_min.left | |
} | |
return current_min | |
} | |
func FindMax(root *Node) *Node { | |
//var prev_current_max *Node | |
current_max := root | |
for current_max.right != nil { | |
//prev_current_max = current_max | |
current_max = current_max.right | |
} | |
return current_max | |
} | |
func deleteNode_Recursion(root *Node, v value, deleteDirection DeleteDirection ) *Node { | |
if root != nil { | |
if root.id > v { | |
root.left = deleteNode_Recursion(root.left, v, deleteDirection) | |
goto END | |
} | |
if root.id < v { | |
root.left = deleteNode_Recursion(root.left, v, deleteDirection) | |
goto END | |
} | |
if root.id == v { | |
if root.left == nil && root.right == nil { | |
root = nil | |
goto END | |
} | |
if root.left == nil { | |
root = root.right | |
goto END | |
} | |
if root.right == nil { | |
root = root.left | |
goto END | |
} | |
// | |
if deleteDirection == MinFromRight { | |
min := FindMin(root.right) | |
root.id = min.id | |
root.right = deleteNode_Recursion(root.right, min.id, deleteDirection) | |
goto END | |
} | |
if deleteDirection == MaxFromLeft { | |
min := FindMax(root.left) | |
root.id = min.id | |
root.left = deleteNode_Recursion(root.left, min.id, deleteDirection) | |
goto END | |
} | |
} | |
} | |
END: | |
return root | |
} | |
func getRandomNode(root *Node) *Node { | |
var s, rn []*Node | |
v := map[value] bool{} | |
s = append(s, root) | |
v[root.id] = true | |
for len(s) > 0 { | |
n := s[len(s)-1] | |
s = s[:len(s)-1] | |
rn = append(rn, n) | |
if n.left != nil { | |
if !v[n.left.id] { | |
s = append(s, n.left) | |
v[n.left.id] = true | |
} | |
} | |
if n.right != nil { | |
if !v[n.right.id] { | |
s = append(s, n.right) | |
v[n.right.id] = true | |
} | |
} | |
} | |
rand.Seed(time.Now().UnixNano()) | |
//fmt.Print("Total:", len(v), " Index:", ) | |
//fmt.Println() | |
return rn[rand.Intn(len(v)-1)] | |
} | |
func InOrder(root *Node)[]value { | |
var result []value | |
if root != nil { | |
result = append(result, InOrder(root.left)...) | |
result = append(result, root.id) | |
result = append(result, InOrder(root.right)...) | |
} | |
return result | |
} | |
func PreOrder(root *Node) []value { | |
var result []value | |
if root != nil { | |
result = append(result, root.id) | |
result = append(result, PreOrder(root.left)...) | |
result = append(result, PreOrder(root.right)...) | |
} | |
return result | |
} | |
func PostOrder(root *Node) []value { | |
var result []value | |
if root != nil { | |
result = append(result, PostOrder(root.left)...) | |
result = append(result, PostOrder(root.right)...) | |
result = append(result, root.id) | |
} | |
return result | |
} | |
func CompareTree(expected *Node, actual * Node) bool { | |
IsIntArraysEquals := func (a []value, b []value) bool { | |
if len(a) != len(b) { | |
return false | |
} | |
for _, av := range a { | |
for _, bv := range b { | |
if av == bv { | |
goto Next | |
} | |
} | |
return false | |
Next: | |
} | |
return true | |
} | |
e_InOrder := InOrder(expected) | |
r_InOrder := InOrder(actual) | |
if !IsIntArraysEquals(e_InOrder,r_InOrder) { | |
fmt.Print("InOrder --> ") | |
fmt.Println() | |
fmt.Print("Expected:", e_InOrder) | |
fmt.Println() | |
fmt.Print("Actual: ", r_InOrder) | |
fmt.Println() | |
fmt.Println("--------------------------------------------------------------------------------") | |
fmt.Println() | |
return false | |
} | |
e_PreOrder := PreOrder(expected) | |
r_PreOrder := PreOrder(actual) | |
if !IsIntArraysEquals(e_PreOrder,r_PreOrder) { | |
fmt.Print("PreOrder --> ") | |
fmt.Println() | |
fmt.Print("Expected:", e_PreOrder) | |
fmt.Println() | |
fmt.Print("Actual: ", r_PreOrder) | |
fmt.Println() | |
fmt.Println("--------------------------------------------------------------------------------") | |
fmt.Println() | |
return false | |
} | |
e_PostOrder := PostOrder(expected) | |
r_PostOrder := PostOrder(actual) | |
if !IsIntArraysEquals(e_PostOrder,r_PostOrder) { | |
fmt.Print("PostOrder --> ") | |
fmt.Println() | |
fmt.Print("Expected:", e_PostOrder) | |
fmt.Println() | |
fmt.Print("Actual: ", r_PostOrder) | |
fmt.Println() | |
fmt.Println("--------------------------------------------------------------------------------") | |
fmt.Println() | |
return false | |
} | |
return true | |
} | |
func Test_DeleteNode(t *testing.T) { | |
testDatas := []struct{ | |
root *Node | |
v value | |
derection DeleteDirection | |
result *Node | |
} { | |
//MaxFromLeft | |
{ | |
&Node{ | |
id: 12, | |
left: &Node{ | |
id: 5, | |
left: &Node{ | |
id: 3, | |
left: &Node{ | |
id: 1, | |
}, | |
}, | |
right: &Node{ | |
id: 7, | |
right: &Node{ | |
id: 9, | |
left: &Node{ | |
id: 8, | |
}, | |
right: &Node{ | |
id: 11, | |
}, | |
}, | |
}, | |
}, | |
right: &Node{ | |
id: 14, | |
left: &Node{ | |
id: 13, | |
}, | |
right: &Node{ | |
id: 17, | |
right: &Node{ | |
id: 20, | |
left: &Node{ | |
id: 18, | |
}, | |
}, | |
}, | |
}, | |
}, | |
5, | |
MaxFromLeft, | |
&Node{ | |
id: 12, | |
left: &Node{ | |
id: 3, | |
left: &Node{ | |
id: 1, | |
}, | |
right: &Node{ | |
id: 7, | |
right: &Node{ | |
id: 9, | |
left: &Node{ | |
id: 8, | |
}, | |
right: &Node{ | |
id: 11, | |
}, | |
}, | |
}, | |
}, | |
right: &Node{ | |
id: 14, | |
left: &Node{ | |
id: 13, | |
}, | |
right: &Node{ | |
id: 17, | |
right: &Node{ | |
id: 20, | |
left: &Node{ | |
id: 18, | |
}, | |
}, | |
}, | |
}, | |
}, | |
}, | |
{ | |
&Node{ | |
id: 12, | |
left: &Node{ | |
id: 5, | |
left: &Node{ | |
id: 3, | |
left: &Node{ | |
id: 1, | |
}, | |
}, | |
right: &Node{ | |
id: 7, | |
right: &Node{ | |
id: 9, | |
left: &Node{ | |
id: 8, | |
}, | |
right: &Node{ | |
id: 11, | |
}, | |
}, | |
}, | |
}, | |
right: &Node{ | |
id: 14, | |
left: &Node{ | |
id: 13, | |
}, | |
right: &Node{ | |
id: 17, | |
right: &Node{ | |
id: 20, | |
left: &Node{ | |
id: 18, | |
}, | |
}, | |
}, | |
}, | |
}, | |
1, | |
MaxFromLeft, | |
&Node{ | |
id: 12, | |
left: &Node{ | |
id: 5, | |
left: &Node{ | |
id: 3, | |
}, | |
right: &Node{ | |
id: 7, | |
right: &Node{ | |
id: 9, | |
left: &Node{ | |
id: 8, | |
}, | |
right: &Node{ | |
id: 11, | |
}, | |
}, | |
}, | |
}, | |
right: &Node{ | |
id: 14, | |
left: &Node{ | |
id: 13, | |
}, | |
right: &Node{ | |
id: 17, | |
right: &Node{ | |
id: 20, | |
left: &Node{ | |
id: 18, | |
}, | |
}, | |
}, | |
}, | |
}, | |
}, | |
{ | |
&Node{ | |
id: 12, | |
left: &Node{ | |
id: 5, | |
left: &Node{ | |
id: 3, | |
left: &Node{ | |
id: 1, | |
}, | |
}, | |
right: &Node{ | |
id: 7, | |
right: &Node{ | |
id: 9, | |
left: &Node{ | |
id: 8, | |
}, | |
right: &Node{ | |
id: 11, | |
}, | |
}, | |
}, | |
}, | |
right: &Node{ | |
id: 14, | |
left: &Node{ | |
id: 13, | |
}, | |
right: &Node{ | |
id: 17, | |
right: &Node{ | |
id: 20, | |
left: &Node{ | |
id: 18, | |
}, | |
}, | |
}, | |
}, | |
}, | |
3, | |
MaxFromLeft, | |
&Node{ | |
id: 12, | |
left: &Node{ | |
id: 5, | |
left: &Node{ | |
id: 1, | |
}, | |
right: &Node{ | |
id: 7, | |
right: &Node{ | |
id: 9, | |
left: &Node{ | |
id: 8, | |
}, | |
right: &Node{ | |
id: 11, | |
}, | |
}, | |
}, | |
}, | |
right: &Node{ | |
id: 14, | |
left: &Node{ | |
id: 13, | |
}, | |
right: &Node{ | |
id: 17, | |
right: &Node{ | |
id: 20, | |
left: &Node{ | |
id: 18, | |
}, | |
}, | |
}, | |
}, | |
}, | |
}, | |
{ | |
&Node{ | |
id: 12, | |
left: &Node{ | |
id: 6, | |
left: &Node{ | |
id: 3, | |
left: &Node{ | |
id: 1, | |
}, | |
right: &Node{ | |
id: 5, | |
left: &Node{ | |
id: 4, | |
}, | |
}, | |
}, | |
right: &Node{ | |
id: 7, | |
right: &Node{ | |
id: 9, | |
left: &Node{ | |
id: 8, | |
}, | |
right: &Node{ | |
id: 11, | |
}, | |
}, | |
}, | |
}, | |
right: &Node{ | |
id: 14, | |
left: &Node{ | |
id: 13, | |
}, | |
right: &Node{ | |
id: 17, | |
right: &Node{ | |
id: 20, | |
left: &Node{ | |
id: 18, | |
}, | |
}, | |
}, | |
}, | |
}, | |
6, | |
MaxFromLeft, | |
&Node{ | |
id: 12, | |
left: &Node{ | |
id: 5, | |
left: &Node{ | |
id: 3, | |
left: &Node{ | |
id: 1, | |
}, | |
right: &Node{ | |
id: 4, | |
}, | |
}, | |
right: &Node{ | |
id: 7, | |
right: &Node{ | |
id: 9, | |
left: &Node{ | |
id: 8, | |
}, | |
right: &Node{ | |
id: 11, | |
}, | |
}, | |
}, | |
}, | |
right: &Node{ | |
id: 14, | |
left: &Node{ | |
id: 13, | |
}, | |
right: &Node{ | |
id: 17, | |
right: &Node{ | |
id: 20, | |
left: &Node{ | |
id: 18, | |
}, | |
}, | |
}, | |
}, | |
}, | |
}, | |
{ | |
&Node{ | |
id: 12, | |
left: &Node{ | |
id: 6, | |
left: &Node{ | |
id: 3, | |
left: &Node{ | |
id: 1, | |
}, | |
right: &Node{ | |
id: 5, | |
left: &Node{ | |
id: 4, | |
}, | |
}, | |
}, | |
right: &Node{ | |
id: 7, | |
right: &Node{ | |
id: 9, | |
left: &Node{ | |
id: 8, | |
}, | |
right: &Node{ | |
id: 11, | |
}, | |
}, | |
}, | |
}, | |
right: &Node{ | |
id: 14, | |
left: &Node{ | |
id: 13, | |
}, | |
right: &Node{ | |
id: 17, | |
right: &Node{ | |
id: 20, | |
left: &Node{ | |
id: 18, | |
}, | |
}, | |
}, | |
}, | |
}, | |
7, | |
MaxFromLeft, | |
&Node{ | |
id: 12, | |
left: &Node{ | |
id: 6, | |
left: &Node{ | |
id: 3, | |
left: &Node{ | |
id: 1, | |
}, | |
right: &Node{ | |
id: 5, | |
left: &Node{ | |
id: 4, | |
}, | |
}, | |
}, | |
right: &Node{ | |
id: 9, | |
left: &Node{ | |
id: 8, | |
}, | |
right: &Node{ | |
id: 11, | |
}, | |
}, | |
}, | |
right: &Node{ | |
id: 14, | |
left: &Node{ | |
id: 13, | |
}, | |
right: &Node{ | |
id: 17, | |
right: &Node{ | |
id: 20, | |
left: &Node{ | |
id: 18, | |
}, | |
}, | |
}, | |
}, | |
}, | |
}, | |
{ | |
&Node{ | |
id: 12, | |
left: &Node{ | |
id: 6, | |
left: &Node{ | |
id: 3, | |
left: &Node{ | |
id: 1, | |
}, | |
right: &Node{ | |
id: 5, | |
left: &Node{ | |
id: 4, | |
}, | |
}, | |
}, | |
right: &Node{ | |
id: 7, | |
right: &Node{ | |
id: 9, | |
left: &Node{ | |
id: 8, | |
}, | |
right: &Node{ | |
id: 11, | |
}, | |
}, | |
}, | |
}, | |
right: &Node{ | |
id: 14, | |
left: &Node{ | |
id: 13, | |
}, | |
right: &Node{ | |
id: 17, | |
right: &Node{ | |
id: 20, | |
left: &Node{ | |
id: 18, | |
}, | |
}, | |
}, | |
}, | |
}, | |
9, | |
MaxFromLeft, | |
&Node{ | |
id: 12, | |
left: &Node{ | |
id: 6, | |
left: &Node{ | |
id: 3, | |
left: &Node{ | |
id: 1, | |
}, | |
right: &Node{ | |
id: 5, | |
left: &Node{ | |
id: 4, | |
}, | |
}, | |
}, | |
right: &Node{ | |
id: 7, | |
right: &Node{ | |
id: 8, | |
right: &Node{ | |
id: 11, | |
}, | |
}, | |
}, | |
}, | |
right: &Node{ | |
id: 14, | |
left: &Node{ | |
id: 13, | |
}, | |
right: &Node{ | |
id: 17, | |
right: &Node{ | |
id: 20, | |
left: &Node{ | |
id: 18, | |
}, | |
}, | |
}, | |
}, | |
}, | |
}, | |
{ | |
&Node{ | |
id: 12, | |
left: &Node{ | |
id: 6, | |
left: &Node{ | |
id: 3, | |
left: &Node{ | |
id: 1, | |
}, | |
right: &Node{ | |
id: 5, | |
left: &Node{ | |
id: 4, | |
}, | |
}, | |
}, | |
right: &Node{ | |
id: 7, | |
right: &Node{ | |
id: 9, | |
left: &Node{ | |
id: 8, | |
}, | |
right: &Node{ | |
id: 11, | |
}, | |
}, | |
}, | |
}, | |
right: &Node{ | |
id: 14, | |
left: &Node{ | |
id: 13, | |
}, | |
right: &Node{ | |
id: 17, | |
right: &Node{ | |
id: 20, | |
left: &Node{ | |
id: 18, | |
}, | |
}, | |
}, | |
}, | |
}, | |
14, | |
MaxFromLeft, | |
&Node{ | |
id: 12, | |
left: &Node{ | |
id: 6, | |
left: &Node{ | |
id: 3, | |
left: &Node{ | |
id: 1, | |
}, | |
right: &Node{ | |
id: 5, | |
left: &Node{ | |
id: 4, | |
}, | |
}, | |
}, | |
right: &Node{ | |
id: 7, | |
right: &Node{ | |
id: 9, | |
left: &Node{ | |
id: 8, | |
}, | |
right: &Node{ | |
id: 11, | |
}, | |
}, | |
}, | |
}, | |
right: &Node{ | |
id: 13, | |
right: &Node{ | |
id: 17, | |
right: &Node{ | |
id: 20, | |
left: &Node{ | |
id: 18, | |
}, | |
}, | |
}, | |
}, | |
}, | |
}, | |
{ | |
&Node{ | |
id: 12, | |
left: &Node{ | |
id: 6, | |
left: &Node{ | |
id: 3, | |
left: &Node{ | |
id: 1, | |
}, | |
right: &Node{ | |
id: 5, | |
left: &Node{ | |
id: 4, | |
}, | |
}, | |
}, | |
right: &Node{ | |
id: 7, | |
right: &Node{ | |
id: 9, | |
left: &Node{ | |
id: 8, | |
}, | |
right: &Node{ | |
id: 11, | |
}, | |
}, | |
}, | |
}, | |
right: &Node{ | |
id: 14, | |
left: &Node{ | |
id: 13, | |
}, | |
right: &Node{ | |
id: 17, | |
right: &Node{ | |
id: 20, | |
left: &Node{ | |
id: 18, | |
}, | |
}, | |
}, | |
}, | |
}, | |
12, | |
MaxFromLeft, | |
&Node{ | |
id: 11, | |
left: &Node{ | |
id: 6, | |
left: &Node{ | |
id: 3, | |
left: &Node{ | |
id: 1, | |
}, | |
right: &Node{ | |
id: 5, | |
left: &Node{ | |
id: 4, | |
}, | |
}, | |
}, | |
right: &Node{ | |
id: 7, | |
right: &Node{ | |
id: 9, | |
left: &Node{ | |
id: 8, | |
}, | |
}, | |
}, | |
}, | |
right: &Node{ | |
id: 14, | |
left: &Node{ | |
id: 13, | |
}, | |
right: &Node{ | |
id: 17, | |
right: &Node{ | |
id: 20, | |
left: &Node{ | |
id: 18, | |
}, | |
}, | |
}, | |
}, | |
}, | |
}, | |
//MinFromRight | |
{ | |
&Node{ | |
id: 12, | |
left: &Node{ | |
id: 6, | |
left: &Node{ | |
id: 3, | |
left: &Node{ | |
id: 1, | |
}, | |
right: &Node{ | |
id: 5, | |
left: &Node{ | |
id: 4, | |
}, | |
}, | |
}, | |
right: &Node{ | |
id: 7, | |
right: &Node{ | |
id: 9, | |
left: &Node{ | |
id: 8, | |
}, | |
right: &Node{ | |
id: 11, | |
}, | |
}, | |
}, | |
}, | |
right: &Node{ | |
id: 14, | |
left: &Node{ | |
id: 13, | |
}, | |
right: &Node{ | |
id: 17, | |
right: &Node{ | |
id: 20, | |
left: &Node{ | |
id: 18, | |
}, | |
}, | |
}, | |
}, | |
}, | |
6, | |
MinFromRight, | |
&Node{ | |
id: 12, | |
left: &Node{ | |
id: 7, | |
left: &Node{ | |
id: 3, | |
left: &Node{ | |
id: 1, | |
}, | |
right: &Node{ | |
id: 5, | |
left: &Node{ | |
id: 4, | |
}, | |
}, | |
}, | |
right:&Node{ | |
id: 9, | |
left: &Node{ | |
id: 8, | |
}, | |
right: &Node{ | |
id: 11, | |
}, | |
}, | |
}, | |
right: &Node{ | |
id: 14, | |
left: &Node{ | |
id: 13, | |
}, | |
right: &Node{ | |
id: 17, | |
right: &Node{ | |
id: 20, | |
left: &Node{ | |
id: 18, | |
}, | |
}, | |
}, | |
}, | |
}, | |
}, | |
{ | |
&Node{ | |
id: 12, | |
left: &Node{ | |
id: 6, | |
left: &Node{ | |
id: 3, | |
left: &Node{ | |
id: 1, | |
}, | |
right: &Node{ | |
id: 5, | |
left: &Node{ | |
id: 4, | |
}, | |
}, | |
}, | |
right: &Node{ | |
id: 7, | |
right: &Node{ | |
id: 9, | |
left: &Node{ | |
id: 8, | |
}, | |
right: &Node{ | |
id: 11, | |
}, | |
}, | |
}, | |
}, | |
right: &Node{ | |
id: 14, | |
left: &Node{ | |
id: 13, | |
}, | |
right: &Node{ | |
id: 17, | |
right: &Node{ | |
id: 20, | |
left: &Node{ | |
id: 18, | |
}, | |
}, | |
}, | |
}, | |
}, | |
14, | |
MinFromRight, | |
&Node{ | |
id: 12, | |
left: &Node{ | |
id: 6, | |
left: &Node{ | |
id: 3, | |
left: &Node{ | |
id: 1, | |
}, | |
right: &Node{ | |
id: 5, | |
left: &Node{ | |
id: 4, | |
}, | |
}, | |
}, | |
right: &Node{ | |
id: 7, | |
right: &Node{ | |
id: 9, | |
left: &Node{ | |
id: 8, | |
}, | |
right: &Node{ | |
id: 11, | |
}, | |
}, | |
}, | |
}, | |
right: &Node{ | |
id: 17, | |
left: &Node{ | |
id: 13, | |
}, | |
right: &Node{ | |
id: 20, | |
left: &Node{ | |
id: 18, | |
}, | |
}, | |
}, | |
}, | |
}, | |
{ | |
&Node{ | |
id: 12, | |
left: &Node{ | |
id: 6, | |
left: &Node{ | |
id: 3, | |
left: &Node{ | |
id: 1, | |
}, | |
right: &Node{ | |
id: 5, | |
left: &Node{ | |
id: 4, | |
}, | |
}, | |
}, | |
right: &Node{ | |
id: 7, | |
right: &Node{ | |
id: 9, | |
left: &Node{ | |
id: 8, | |
}, | |
right: &Node{ | |
id: 11, | |
}, | |
}, | |
}, | |
}, | |
right: &Node{ | |
id: 14, | |
left: &Node{ | |
id: 13, | |
}, | |
right: &Node{ | |
id: 17, | |
right: &Node{ | |
id: 20, | |
left: &Node{ | |
id: 18, | |
}, | |
}, | |
}, | |
}, | |
}, | |
18, | |
MinFromRight, | |
&Node{ | |
id: 12, | |
left: &Node{ | |
id: 6, | |
left: &Node{ | |
id: 3, | |
left: &Node{ | |
id: 1, | |
}, | |
right: &Node{ | |
id: 5, | |
left: &Node{ | |
id: 4, | |
}, | |
}, | |
}, | |
right: &Node{ | |
id: 7, | |
right: &Node{ | |
id: 9, | |
left: &Node{ | |
id: 8, | |
}, | |
right: &Node{ | |
id: 11, | |
}, | |
}, | |
}, | |
}, | |
right: &Node{ | |
id: 14, | |
left: &Node{ | |
id: 13, | |
}, | |
right: &Node{ | |
id: 17, | |
right: &Node{ | |
id: 20, | |
}, | |
}, | |
}, | |
}, | |
}, | |
{ | |
&Node{ | |
id: 12, | |
left: &Node{ | |
id: 6, | |
left: &Node{ | |
id: 3, | |
left: &Node{ | |
id: 1, | |
}, | |
right: &Node{ | |
id: 5, | |
left: &Node{ | |
id: 4, | |
}, | |
}, | |
}, | |
right: &Node{ | |
id: 7, | |
right: &Node{ | |
id: 9, | |
left: &Node{ | |
id: 8, | |
}, | |
right: &Node{ | |
id: 11, | |
}, | |
}, | |
}, | |
}, | |
right: &Node{ | |
id: 14, | |
left: &Node{ | |
id: 13, | |
}, | |
right: &Node{ | |
id: 17, | |
right: &Node{ | |
id: 20, | |
left: &Node{ | |
id: 18, | |
}, | |
}, | |
}, | |
}, | |
}, | |
9, | |
MinFromRight, | |
&Node{ | |
id: 12, | |
left: &Node{ | |
id: 6, | |
left: &Node{ | |
id: 3, | |
left: &Node{ | |
id: 1, | |
}, | |
right: &Node{ | |
id: 5, | |
left: &Node{ | |
id: 4, | |
}, | |
}, | |
}, | |
right: &Node{ | |
id: 7, | |
right: &Node{ | |
id: 11, | |
left: &Node{ | |
id: 8, | |
}, | |
}, | |
}, | |
}, | |
right: &Node{ | |
id: 14, | |
left: &Node{ | |
id: 13, | |
}, | |
right: &Node{ | |
id: 17, | |
right: &Node{ | |
id: 20, | |
left: &Node{ | |
id: 18, | |
}, | |
}, | |
}, | |
}, | |
}, | |
}, | |
{ | |
&Node{ | |
id: 12, | |
left: &Node{ | |
id: 6, | |
left: &Node{ | |
id: 3, | |
left: &Node{ | |
id: 1, | |
}, | |
right: &Node{ | |
id: 5, | |
left: &Node{ | |
id: 4, | |
}, | |
}, | |
}, | |
right: &Node{ | |
id: 7, | |
right: &Node{ | |
id: 9, | |
left: &Node{ | |
id: 8, | |
}, | |
right: &Node{ | |
id: 11, | |
}, | |
}, | |
}, | |
}, | |
right: &Node{ | |
id: 14, | |
left: &Node{ | |
id: 13, | |
}, | |
right: &Node{ | |
id: 17, | |
right: &Node{ | |
id: 20, | |
left: &Node{ | |
id: 18, | |
}, | |
}, | |
}, | |
}, | |
}, | |
12, | |
MinFromRight, | |
&Node{ | |
id: 13, | |
left: &Node{ | |
id: 6, | |
left: &Node{ | |
id: 3, | |
left: &Node{ | |
id: 1, | |
}, | |
right: &Node{ | |
id: 5, | |
left: &Node{ | |
id: 4, | |
}, | |
}, | |
}, | |
right: &Node{ | |
id: 7, | |
right: &Node{ | |
id: 9, | |
left: &Node{ | |
id: 8, | |
}, | |
right: &Node{ | |
id: 11, | |
}, | |
}, | |
}, | |
}, | |
right: &Node{ | |
id: 14, | |
right: &Node{ | |
id: 17, | |
right: &Node{ | |
id: 20, | |
left: &Node{ | |
id: 18, | |
}, | |
}, | |
}, | |
}, | |
}, | |
}, | |
} | |
for _, td := range testDatas { | |
r := deleteNode_Recursion(td.root, td.v, td.derection) | |
if !CompareTree(td.result, r) { | |
t.Errorf("Source: %v \n Expected: %v, Actual: %v", | |
td.root, | |
td.result, | |
r) | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment