首先一个简单的App是MVC架构的,所以就要在View 的界面上表示一棵二叉树,一般人的脑海中浮现的树的结构如图
所以是不是的在View 的界面上,每个节点放一个UILable 来表示,然后用数学方法计算每个UILable 对应的位置,
- 每个UILable 的位置计算起来比较麻烦
- 如果一棵树有很多个节点,那么当前界面就会展示不下,这个时候怎么办?就算用UIScrollView 来处理,整棵树也会变得非常不直观。每个节点对应的UILable的位置计算起来就会更费劲。
要处理大量的数据,一般人就会想到UITableView.假如每一个cell对应一个节点,以及其左右
- 无需计算位置,UILableView 提供复用cell 效率大幅度提高
- 面对很多节点的问题,可以先处理一部分数据,然后用处理 infinite scroll 的方式来加载剩余数据。
代码
func p_levelOrder(root:TreeNode?) -> [[Int]] {
var res = [[Int]]()
//用数组来实现队列
var queue = [TreeNode]()
if let root = root {
queue.append(root)
}
while queue.count > 0 {
let size = queue.count
var level = [Int]()
for _ in 0..<size {
let node = queue.removeFirst()
level.append(node.val)
if let left = node.left {
queue.append(left)
}
if let right = node.right {
queue.append(right)
}
}
res.append(level)
}
return res
}
测试
@objc func levelOrder()
{
//给定二叉树 [1, 2, 3, 4, 5, 6,7,8]
let root = TreeNode.init(val: 1)
root.left = TreeNode.init(val: 2)
root.right = TreeNode.init(val: 3)
let second = root.left
second?.left = TreeNode.init(val: 4)
second?.right = TreeNode.init(val: 5)
let thred = second?.right
thred?.left = TreeNode.init(val: 7)
thred?.right = TreeNode.init(val: 8)
let four = second?.left
four?.left = TreeNode.init(val: 6)
let result = self.p_levelOrder(root: root)
print("设计一棵二叉树\(result)")
}
结果
设计一棵二叉树[[1], [2, 3], [4, 5], [6, 7, 8]]