二元樹的走訪(前序、中序、後序)
使用Swift
/*
* 給出一個整數陣列。
* 按順序遍歷二元樹(Pre_Order、In_Order、Post_Order)。
*
輸入 :
根 = [1, 2, 3, -1, 4, 5, 6]
圖形:
1
/ \
2 3
/\ /\
無 4 5 6
-1 表示 nil,一個正整數表示節點的值(唯一)。
輸出 (Pre_Order):
[1, 2, 4, 3, 5, 6]
*
*/
// 首先,設計一個枚舉來區分前序、中序、後序
enum OrderType {
case Pre_Order // 前序
case In_Order // 中序
case Post_Order // 後序
}
// 設計一個“節點”物件
class Node {
var value:Int
var left:Node?
var right:Node?
init(value:Int!) {
self.value = value
}
}
// 設計一個類,用來:
class Solution {
// 建立二元樹
func BuildTree(nums: [Int], pos: Int) -> Node? {
if (pos >= nums.count || nums[pos] == -1) {
return nil
}
let node = Node(value: nums[pos])
node.left = BuildTree(nums: nums, pos: pos * 2 + 1)
node.right = BuildTree(nums: nums, pos: pos * 2 + 2)
return node
}
// 走訪二元樹
func Traversal(root: Node!, orderType: OrderType) -> [Int] {
var result = [Int]()
switch orderType {
case .Pre_Order:
PreOrderTraversal(root: root, result: &result)
case .In_Order:
InOrderTraversal(root: root, result: &result)
case .Post_Order:
PostOrderTraversal(root: root, result: &result)
}
return result
}
// 前序走訪
func PreOrderTraversal(root: Node!, result: inout [Int]) {
if (root == nil) {
return
}
result.append(root.value)
PreOrderTraversal(root: root.left, result: &result)
PreOrderTraversal(root: root.right, result: &result)
}
// 中序走訪
func InOrderTraversal(root: Node!, result: inout [Int]) {
if (root == nil) {
return
}
InOrderTraversal(root: root.left, result: &result)
result.append(root.value)
InOrderTraversal(root: root.right, result: &result)
}
// 後序走訪
func PostOrderTraversal(root: Node!, result: inout [Int]) {
if (root == nil) {
return
}
PostOrderTraversal(root: root.left, result: &result)
PostOrderTraversal(root: root.right, result: &result)
result.append(root.value)
}
}
var solution = Solution()
if let root = solution.BuildTree(nums: [1, 2, 3, -1, 4, 5, 6], pos: 0) {
print("Pre_Order :")
print(solution.Traversal(root: root, orderType: OrderType.Pre_Order))
print("In_Order :")
print(solution.Traversal(root: root, orderType: OrderType.In_Order))
print("Post_Order :")
print(solution.Traversal(root: root, orderType: OrderType.Post_Order))
}
else {
print(-1)
}
// Output:
Pre_Order :
[1, 2, 4, 3, 5, 6]
In_Order :
[2, 4, 1, 5, 3, 6]
Post_Order :
[4, 2, 5, 6, 3, 1]
if let root = solution.BuildTree(nums: [], pos: 0) {
print("Pre_Order :")
print(solution.Traversal(root: root, orderType: OrderType.Pre_Order))
print("In_Order :")
print(solution.Traversal(root: root, orderType: OrderType.In_Order))
print("Post_Order :")
print(solution.Traversal(root: root, orderType: OrderType.Post_Order))
}
else {
print(-1)
}
// Output:
-1