3
4 5
6 7 8 9
10 11
二叉树的定义和初始化
二叉树的前序遍历:
func preorder(root:TreeNode?) -> [Int] {
guard let root = root else {
return []
}
var res = [Int]()
res.append(root.val)
res += preorder(root: root.left)
res += preorder(root: root.right)
return res
}
func preorderTraversal(root:TreeNode?) ->[Int] {
guard let root = root else {
return []
}
var res = [Int]()
var roots = [TreeNode]()
var current:TreeNode? = root
while !roots.isEmpty || current != nil {
while current != nil {
res.append(current!.val)
roots.append(current!)
current = current!.left
}
if current == nil {
current = roots.removeLast()
current = current?.right
}
}
return res
}
let resVal = preorder(root: root)//[3, 4, 6, 7, 10, 11, 5, 8, 9]
let resVal1 = preorderTraversal(root: root)//[3, 4, 6, 7, 10, 11, 5, 8, 9]
二叉树的中序遍历:
func inOrder(root:TreeNode?) -> [Int] {
guard let root = root else {
return []
}
var res = [Int]()
res += inOrder(root: root.left)
res.append(root.val)
res += inOrder(root: root.right)
return res
}
func inorderTraversal(root: TreeNode?) ->[Int] {
guard let root = root else {
return []
}
var res = [Int]()
var roots = [TreeNode]()
var current:TreeNode? = root
while !roots.isEmpty || current != nil {
while current != nil {
roots.append(current!)
current = current!.left
}
if current == nil {
current = roots.removeLast()
res.append(current!.val)
current = current!.right
}
}
return res
}
var resVal2 = inOrder(root: root)//[6, 4, 10, 7, 11, 3, 8, 5, 9]
var resVal3 = inorderTraversal(root: root)//[6, 4, 10, 7, 11, 3, 8, 5, 9]
二叉树的后续遍历:
func postOrder(root:TreeNode?) -> [Int] {
guard let root = root else { return [] }
var res = [Int]()
res += postOrder(root: root.left)
res += postOrder(root: root.right)
res.append(root.val)
return res
}
func postorderTraversal(root:TreeNode?) -> [Int] {
guard let root = root else { return [] }
var res = [Int]()
var roots = [TreeNode]()
roots.append(root)
while !roots.isEmpty {
let current:TreeNode? = roots.removeLast()
res.append(current!.val)
if current!.left != nil {
roots.append(current!.left!)
}
if current!.right != nil {
roots.append(current!.right!)
}
}
return res.reversed()
}
let resVal4 = postOrder(root: root)//[6, 10, 11, 7, 4, 8, 9, 5, 3]
let resVal5 = postorderTraversal(root: root)//[6, 10, 11, 7, 4, 8, 9, 5, 3]