рдПрдХ рдмрд╛рдЗрдирд░реА рдЯреНрд░реА рдмрдирд╛рдирд╛

рдЬрдм рдореИрдВрдиреЗ рд░реВрдмреА рд╕реАрдЦрдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛, рддреЛ рдореИрдВрдиреЗ рднрд╛рд╖рд╛ рдХреЛ рдмреЗрд╣рддрд░ рдврдВрдЧ рд╕реЗ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рджреНрд╡рд┐рдЖрдзрд╛рд░реА рд╡реГрдХреНрд╖ рдФрд░ рдЗрд╕рдХреЗ рдХреБрдЫ рдмреБрдирд┐рдпрд╛рджреА рд╕рдВрдЪрд╛рд▓рди (рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░реЗрдВ, рд╣рдЯрд╛рдПрдВ, рдЪрд▓рдирд╛ рдФрд░ рдЦреЛрдЬ) рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред рдмрд╛рдЗрдирд░реА рдЯреНрд░реА, рдпрд╣ рднрд╛рд╖рд╛ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡реНрдпрд╛рдпрд╛рдо рд╣реИ, рдЬреИрд╕реЗ: рд╕рд╢рд░реНрдд рд╕рдВрдЪрд╛рд▓рдХ, рд▓реВрдк, рдХрдХреНрд╖рд╛рдПрдВред рдЗрд╕реА рд╕рдордп, рдпрд╣ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЕрд╡рд╕рд░ рд╣реИред рдмрд╛рдЗрдирд░реА рдЯреНрд░реА рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рдХрдИ рдкреБрд╕реНрддрдХреЛрдВ рдФрд░ рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдХрд╛рд░реНрдп рдХреЛ рдЬрдЯрд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдПрдЪрдЯреАрдПрдордПрд▓ 5 рдФрд░ рдХреИрдирд╡рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрд╛рдЗрдирд░реА рдЯреНрд░реА рдХреЗ рдкреНрд░рддрд┐рдкрд╛рджрди рдХреЛ рднреА рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ред рдпрд╣ рдЖрдкрдХреЛ рдмрд╛рдЗрдирд░реА рдЯреНрд░реА рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдордЭрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЖрдк рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░ рдбреЗрдореЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред
рдЕрдЧрд▓рд╛, рдореИрдВ рдмрд╛рдЗрдирд░реА рдЯреНрд░реА рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдмреБрдирд┐рдпрд╛рджреА рддрд░реАрдХреЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛ред

рдмрд╛рдЗрдирд░реА рдЯреНрд░реА рдпрд╛ рдмрд╛рдЗрдирд░реА рд╕рд░реНрдЪ рдЯреНрд░реА


рдиреАрдЪреЗ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдб рдмрд╛рдЗрдирд░реА рд╕рд░реНрдЪ рдЯреНрд░реА (BST) рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдмрд╛рдЗрдирд░реА рдкреЗрдбрд╝реЛрдВ рдХрд╛ рдЕрдзрд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрд╕реНрдХрд░рдг рд╣реИред рдмрд╛рдЗрдирд░реА рдЯреНрд░реА рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рдиреЛрдб рдореЗрдВ 2 рд╕реЗ рдЕрдзрд┐рдХ рдмрдЪреНрдЪреЗ рдирд╣реАрдВ рд╣реИрдВ, рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ "рдмрд╛рдПрдВ рд╕рдмрдЯреНрд░реА" рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛ "рд░рд╛рдЗрдЯ рд╕рдмрдЯреНрд░реА" рд╣реИ, рдХреЛрдИ рдЫрдВрдЯрдиреА рдирд╣реАрдВ рд╣реИред рдмрд╛рдЗрдирд░реА рд╕рд░реНрдЪ рдЯреНрд░реА рдореЗрдВ, рд╕рднреА рдиреЛрдбреНрд╕ рдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдирд┐рдпрдо рдореЗрдВ рдкрд░рд┐рд▓рдХреНрд╖рд┐рдд рдХреНрд░рдо рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рджреНрд╡рд┐рдЖрдзрд╛рд░реА рдЦреЛрдЬ рдЯреНрд░реА рдореЗрдВ x рдПрдХ рдиреЛрдб рд╣реИ, рдпрджрд┐ y, x рдХреЗ рд▓рд┐рдП "рдмрд╛рдПрдВ рд╕рдмрдЯреНрд░реА" рд╣реИ, рддреЛ y.key node xред рдпрджрд┐ x рдХреЗ рд▓рд┐рдП y "рд░рд╛рдЗрдЯ рд╕рдмрдЯреНрд░реА" рд╣реИ, рддреЛ y.key тЙе x.key рд╣реИред


рдПрдХ рджреНрд╡рд┐рдЖрдзрд╛рд░реА рдЦреЛрдЬ рдкреЗрдбрд╝ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛


рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдкреЗрдбрд╝ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд░реНрдЧ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

require "binarytree" tree = BinaryTree.new(40) tree.add(30) tree.add(100) tree.add(20) tree.add(35) tree.add(25) tree.add(34) puts "Tree nodes: #{tree.to_s}" => "20, 25, 30, 34, 35, 40, 100" 

рд╣рдо рдЗрд╕ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рдВрдЦреНрдпрд╛рдУрдВ, рддрд╛рд░реЛрдВ, рдпрд╛ рдХрд┐рд╕реА рднреА рджреЗрд╢реА рд░реВрдмреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдорд┐рд▓рд╛рди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВ (рдЕрд░реНрдерд╛рдд, <=>)

рдПрдХ рджреНрд╡рд┐рдЖрдзрд╛рд░реА рдкреЗрдбрд╝ рдореЗрдВ рдиреЛрдбреНрд╕ рдЬреЛрдбрд╝рдирд╛


рдмрд╛рдЗрдирд░реА рдЯреНрд░реА рдореЗрдВ рдиреЛрдбреНрд╕ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдХреЛрдб рдиреАрдЪреЗ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдХреЛрдб рдкрд╣рд▓реЗ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдВрдЪрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд░реВрдЯ рдиреЛрдб рд╣реИ, рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдПрдХ рдирдП рдорд╛рди рдХреЗ рд╕рд╛рде рд░реВрдЯ рдиреЛрдб рдмрдирд╛рдПрдВред рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд░реВрдЯ рдиреЛрдб рд╣реИ, рддреЛ рд╣рдо рдЕрдВрддрд┐рдо рдиреЛрдб рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рддрдХ рдкреЗрдбрд╝ рдХреЗ рдиреЛрдбреНрд╕ (рдКрдкрд░ рдмрддрд╛рдП рдЧрдП рдирд┐рдпрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ) рдХреЛ рд╕реНрдХреИрди рдХрд░рддреЗ рд╣реИрдВред рдЬреИрд╕реЗ рд╣реА рд╣рдо рдЕрдВрддрд┐рдо рдиреЛрдб рдкрд░ рдкрд╣реБрдБрдЪрддреЗ рд╣реИрдВ рд╣рдо рдЗрд╕реЗ рдПрдХ рдирдП рдиреЛрдб рдХреА рдУрд░ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВред

 def add(new_value) if @root == nil @root = Node.new(new_value) @total_nodes = 1 return end current = @root while(true) if new_value >= current.value if current.right == nil current.right = Node.new(new_value) break else current = current.right end else if current.left == nil current.left = Node.new(new_value) break else current = current.left end end end @total_nodes += 1 end 

рд▓рдХрдбрд╝реА рдЪрд▓рдирд╛


рдмрд╛рдЗрдирд░реА рд╕рд░реНрдЪ рдЯреНрд░реА рдХреЗ рдлрд╛рдпрджреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕рдореЗрдВ рд╕рдВрдЪрд┐рдд рдореВрд▓реНрдпреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ "рдПрдХ рдЫрдВрдЯрд╛рдИ рд╡рд╛рд▓реЗ рдкреЗрдбрд╝ рдкрд░ рдЪрд▓рдирд╛" рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдкреЗрдбрд╝ рд╣реИ: 100, 50, 200 рдФрд░ 150, рддреЛ рдЫрдВрдЯреЗ рд╣реБрдП рдкреЗрдбрд╝ рд╣рдореЗрдВ рдорд╛рди рджреЗрдВрдЧреЗ: 50, 100, 150 рдФрд░ 200ред рдкреЗрдбрд╝ рдореЗрдВ рдЪрд▓рдирд╛ рдПрдХ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдкреБрдирд░рд╛рд╡рд░реНрддреА рд╡рд┐рдзрд┐, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг, рдкреЗрдбрд╝ рдХреЗ рдмрдбрд╝реЗ рд╣реЛрдиреЗ рдкрд░ рдмрд╣реБрдд рдкреНрд░рднрд╛рд╡реА рдирд╣реАрдВ рд╣реИред рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдХреЛрдб рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдиреЛрдбреНрд╕ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдЯреИрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╕рд░рдгреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╕рдорд╛рдзрд╛рди рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдкреЗрдбрд╝ рдореЗрдВ рд╣рдЬрд╛рд░реЛрдВ рдиреЛрдбреНрд╕ рд╣реЛрдиреЗ рдкрд░ рднреА рдпрд╣ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

 def walk return nil if @root == nil node = @root stack = [] ignore_left = false while(true) #p "processing #{node.value.to_s}" if ignore_left #p "ignoring nodes to the left" ignore_left = false else if node.left != nil #p "moving to the left" stack << node node = node.left next end end yield node if node.right != nil #p "moving to the right" node = node.right next end break if stack.length == 0 #p "popping from the stack" node = stack.pop ignore_left = true end end 

рдЬрдм рдореИрдВ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд░рд╣рд╛ рдерд╛, рдореБрдЭреЗ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреЗ рд░реВрдмреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреА рд╕реБрдВрджрд░рддрд╛ рдФрд░ рд╕рд╛рджрдЧреА рдХрд╛ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ: рдмреНрд▓реЙрдХред рдЬрдм рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдЕрдЧрд▓рд╛ рдиреЛрдб рдкрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдмрд╕ рдХреЙрд▓рд┐рдВрдЧ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рджреЗрддрд╛ рд╣реИред рдпрд╣ рдЖрдкрдХреЛ рдПрдХ рдкреЗрдбрд╝ рдкрд░ рдЪрд▓рдиреЗ рдФрд░ рдЙрди рдХрд╛рд░реНрдпреЛрдВ рд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░ рд╣реЛрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреЛ рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдиреЛрдб рдкрд░ рдкреНрд░рджрд░реНрд╢рди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдкреНрд░рддреНрдпреЗрдХ рдиреЛрдб рдХреЗ рд▓рд┐рдП рдирд┐рдореНрди рдХреЛрдб рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ:

 tree.walk { |node| puts "#{node.value}" } 

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдмреНрд▓реЙрдХ рдХреЗрд╡рд▓ рдорд╛рдиреЛрдВ рдХреЛ "рдкреНрд░рджрд░реНрд╢рд┐рдд" рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдПрдХ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВрдЧреЗ рдЬрдм рд╣рдо рдПрдХ рдмрд╛рдЗрдирд░реА рдЯреНрд░реА рд░реЗрдВрдбрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред

рдмрд╛рдЗрдирд░реА рдЯреНрд░реА рдХреИрд╕реЗ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░реЗрдВ


рдмрд╛рдЗрдирд░реА рдЯреНрд░реА рд░реЗрдВрдбрд░рд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХрд╛рдлреА рд╣рдж рддрдХ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рдЯреНрд░реА рдХреЗ рд╕рдорд╛рди рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╣рдореЗрдВ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдиреЛрдб рдХреЛ рдХрд╣рд╛рдВ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рд╣рдо рдиреЛрдбреНрд╕ рдХреЛ рдХреИрд╕реЗ рдЗрдВрдЯрд░рд╕реЗрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВред рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреА рдЧрдгрдирд╛ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдХрд╛рдо рдерд╛ред

рдореБрдЦреНрдп рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
 def draw_node(root, x, y, block) return if root == nil block.call(root, x, y, x, y) draw_left(root.left, x, y, block) if root.left != nil draw_right(root.right, x, y, block) if root.right != nil end 

рдмрд╛рдПрдВ рд╕рдмрдЯреНрд░реА рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХрд┐рддрдиреЗ рдмрдЪреНрдЪреЗ рдмрд╛рдПрдВ рд╕рдмрдЯреНрд░реА рдХреЗ рджрд╛рдИрдВ рдУрд░ рд╣реИрдВред рдкрд░рд┐рдгрд╛рдореА рд╕рдВрдЦреНрдпрд╛, рд╣рдо рдПрдХреНрд╕ рдЕрдХреНрд╖ рдХреЗ рд╕рд╛рде рдирдХрд╛рд░рд╛рддреНрдордХ рд╡рд┐рд╕реНрдерд╛рдкрди рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рдмрд╛рдИрдВ рдФрд░ рджрд╛рдИрдВ рдУрд░ рд╕рдмрдЯреНрд░реА рдХреЗ рд▓рд┐рдП рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдкреБрди: рдХрд╣рддреЗ рд╣реИрдВред

 def draw_left(node, parent_x, parent_y, block) if node.right != nil count = 1 + children_count(node.right) else count = 0 end x = parent_x - @x_distance - (count*@x_distance) y = parent_y + @y_distance block.call(node.value, x, y, parent_x, parent_y) draw_left(node.left, x, y, block) if node.left != nil draw_right(node.right, x, y, block) if node.right != nil end 

рд╕рд╣реА рдЙрдкрд╢реАрд░реНрд╖рдХ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рд╣реА рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрддред

 def draw_right(node, parent_x, parent_y, block) if node.left != nil count = 1 + children_count(node.left) else count = 0 end x = parent_x + @x_distance + (count*@x_distance) y = parent_y + @y_distance block.call(node.value,x,y, parent_x, parent_y) draw_left(node.left, x, y, block) if node.left != nil draw_right(node.right, x, y, block) if node.right != nil end 

рд╡реЙрдХ рд╡рд┐рдзрд┐ рдХреА рддрд░рд╣, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдХреБрдЫ рднреА рдирд╣реАрдВ рдЦреАрдВрдЪрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред рдирд┐рдореНрди рдЙрджрд╛рд╣рд░рдг рдХрдВрд╕реЛрд▓ рдореЗрдВ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЗ рд╕рд╛рде рдПрдХ рдкреЗрдбрд╝ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ:

 require "binarytree" require "binarytreedrawer" tree = BinaryTree.new tree.add(100) tree.add(50) tree.add(150) tree.add(25) tree.add(75) tree.add(125) tree.add(175) drawer = BinaryTreeDrawer.new(tree) drawer.draw(0,0, Proc.new { |value, x, y, px, py| puts "Value #{value} at (#{x}, #{y})" }) => Value 100 at (0, 0) => Value 50 at (-40, 30) => Value 25 at (-60, 60) => Value 75 at (-20, 60) => Value 150 at (40, 30) => Value 125 at (20, 60) => Value 175 at (60, 60) 

рдПрдХ рд╡реЗрдм рдкреЗрдЬ рдкрд░ рдПрдХ рдмрд╛рдЗрдирд░реА рдЯреНрд░реА рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрджрд╛рд╣рд░рдг


рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рд╣реЛрдиреЗ рдкрд░, рд╣рдо рдХрд┐рд╕реА рднреА рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕реА рдкреЗрдбрд╝ рдХреЛ рдЦреАрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдореИрдВ рдбреНрд░рд╛рдЗрдВрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рддрд╣ рдХреЗ рд░реВрдк рдореЗрдВ HTML 5 рдХреИрдирд╡рд╕ , рдФрд░ рдХрдИ рдЬреЗрдПрд╕ рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдХрд┐ рдХреИрд╕реЗ рдореИрдВ рдЬреЗрдПрд╕ рдХреЙрд▓ рдХреЛ рдПрдХ рдкреЗрдбрд╝ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реВрдВ:

 drawer = BinaryTreeDrawer.new(@tree) drawer.draw(0, 0, Proc.new { |value, x, y, px, py| circles << "draw_circle(centerX + #{x}, offsetY + #{y}, 5);" lines << "draw_line(centerX + #{x}, offsetY + #{y}, centerX + #{px}, offsetY + #{py});" labels << "draw_label(centerX + 7 + #{x}, offsetY+5+#{y}, \"#{value}\");" }) 

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣ рдХреЛрдб рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХреЗ рд╕рд╛рде рдмрд╕ рддреАрди рд╕рд░рдгрд┐рдпрд╛рдБ (рд╕рд░реНрдХрд▓, рд▓рд╛рдЗрдиреЗрдВ, рд▓реЗрдмрд▓) рдмрдирд╛рддрд╛ рд╣реИред рдЗрди рд╕рд░рдгрд┐рдпреЛрдВ рдХреЛ рдмрд╛рдж рдореЗрдВ рдПрдХ рд╡реЗрдм рдкреЗрдЬ рдореЗрдВ рдбрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рд╛рдЗрдб рдкрд░ рдПрдХ рдкреЗрдбрд╝ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╕реЛрд░реНрд╕ рдХреЛрдб рдФрд░ рдбреЗрдореЛ


рдпрджрд┐ рдЖрдк рдПрдХ рдбреЗрдореЛ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк http://binarytree.heroku.com рдкрд░ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдмрд╛рдЗрдирд░реА рдЯреНрд░реА рдЬрдирд░реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдбреЗрдЯрд╛рд╕реЗрдЯ рдХреЗ рд╕рд╛рде рдПрдХ рдмрд╛рдЗрдирд░реА рдЯреНрд░реА рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред

рдмрд╛рдЗрдирд░реА рдЯреНрд░реА рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рд╕рднреА рд╕реНрд░реЛрдд, рд╕рд╛рде рд╣реА рдПрдХ рдбреЗрдореЛ рд╕рд╛рдЗрдЯ, рдЧрд┐рдЯрд╣рдм рдкрд░ рдкреЛрд╕реНрдЯ рдХреА рдЧрдИ рд╣реИ ред

Source: https://habr.com/ru/post/In126091/


All Articles