昨天提到了資料結構,我想深入了解其中幾樣,雖然艱深難懂,但我相信十分重要,今天先從 Tree 開始。
我們先來了解一下基本名詞
這是一種常見的樹狀結構,他由節點組成,每個節點最多有兩個子節點,分為左節點、右節點。
一棵有9個節點且深度為3的二元樹,其根節點的值為2,它既不平衡亦未經過排序 wiki
以下透過 Ruby,展示如何建立、遍歷二叉樹
class TreeNode
attr_accessor :value, :left, :right
def initialize(value)
@value = value
@left = nil
@right = nil
end
end
# 前序遍歷
def preorder_traversal(node)
return [] if node.nil?
result = []
result << node.value
result += preorder_traversal(node.left)
result += preorder_traversal(node.right)
result
end
# 中序遍歷
def inorder_traversal(node)
return [] if node.nil?
result = []
result += inorder_traversal(node.left)
result << node.value
result += inorder_traversal(node.right)
result
end
# 後序遍歷
def postorder_traversal(node)
return [] if node.nil?
result = []
result += postorder_traversal(node.left)
result += postorder_traversal(node.right)
result << node.value
result
end
# 創建二叉樹
root = TreeNode.new(10)
root.left = TreeNode.new(5)
root.right = TreeNode.new(15)
root.left.left = TreeNode.new(3)
root.left.right = TreeNode.new(7)
# 執行遍歷
puts "前序遍歷结果:#{preorder_traversal(root).join(', ')}" # 10, 5, 3, 7, 15
puts "中序遍歷结果:#{inorder_traversal(root).join(', ')}" # 3, 5, 7, 10, 15
puts "后序遍歷结果:#{postorder_traversal(root).join(', ')}" # 3, 7, 5, 15, 10
以上示範了三種遍歷方式
我們來做個簡單的 leet code吧!
94. Binary Tree Inorder Traversal
透過題目就可以知道要使用 Inorder 的方式去做排序。
def inorder_traversal(root)
return [] if root.nil?
result = []
result += inorder_traversal(root.left)
result << root.val
result += inorder_traversal(root.right)
result
end
簡單的 Tree code 介紹,讓我們一起進步吧!