题目描述:从上往下打印出二叉树的每个节点,同层节点从左至右打印。
import Foundation
class For23Solution {
func printTreeNode(_ root: TreeNode?) {
var queue: [TreeNode?] = [TreeNode]()
queue.append(root)
while !queue.isEmpty {
let newRoot = queue.removeFirst()
print(newRoot?.val ?? 0)
if newRoot?.left != nil {
queue.append(newRoot?.left)
}
if newRoot?.right != nil {
queue.append(newRoot?.right)
}
}
}
}
算法思想:题目实际上就是二叉树的层序遍历,如上图,我们借助队列来存储节点来实现层序遍历的效果,具体操作:
- 先将根节点入队列
- 将根节点出队列,打印;然后将其左右子树依次入队列(若其存在)
- 重复步骤2,直到将树遍历完为止。
上面步骤最核心的就是步骤2,步骤2为什么能够实现层序的效果呢?当该节点出栈的时候,才会将下一层的节点(其左右子树)入栈,这样就保证了一层一层的打印效果;由于左子树一直在右子树前面进行操作,所以,不会乱序,可以实现从左往右的效果。
github地址:https://github.com/cubegao/LeetCode