diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index 4fcbbff8dd..1fb9b633af 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -246,6 +246,34 @@ var levelOrder = function(root) { ``` +Swift: +```swift +func levelOrder(_ root: TreeNode?) -> [[Int]] { + var res = [[Int]]() + guard let root = root else { + return res + } + var queue = [TreeNode]() + queue.append(root) + while !queue.isEmpty { + let size = queue.count + var sub = [Int]() + for _ in 0 ..< size { + let node = queue.removeFirst() + sub.append(node.val) + if let left = node.left { + queue.append(left) + } + if let right = node.right { + queue.append(right) + } + } + res.append(sub) + } + return res +} +``` + **此时我们就掌握了二叉树的层序遍历了,那么如下九道力扣上的题目,只需要修改模板的两三行代码(不能再多了),便可打倒!** @@ -426,6 +454,31 @@ var levelOrderBottom = function(root) { }; ``` +Swift: +```swift +func levelOrderBottom(_ root: TreeNode?) -> [[Int]] { + var res = [[Int]]() + guard let root = root else { + return res + } + var queue: [TreeNode] = [root] + while !queue.isEmpty { + var sub = [Int]() + for _ in 0 ..< queue.count { + let node = queue.removeFirst() + sub.append(node.val) + if let left = node.left { + queue.append(left) + } + if let right = node.right { + queue.append(right) + } + } + res.insert(sub, at: 0) + } + return res +} +``` # 199.二叉树的右视图 @@ -604,6 +657,36 @@ var rightSideView = function(root) { }; ``` +Swift: +```swift +func rightSideView(_ root: TreeNode?) -> [Int] { + var res = [Int]() + guard let root = root else { + return res + } + var queue = [TreeNode]() + queue.append(root) + while !queue.isEmpty { + let size = queue.count + for i in 0 ..< size { + let node = queue.removeFirst() + if i == size - 1 { + // 保存 每层最后一个元素 + res.append(node.val) + } + if let left = node.left { + queue.append(left) + } + if let right = node.right { + queue.append(right) + } + } + } + return res +} +``` + + # 637.二叉树的层平均值 [力扣题目链接](https://leetcode-cn.com/problems/average-of-levels-in-binary-tree/) @@ -785,6 +868,34 @@ var averageOfLevels = function(root) { }; ``` +Swift: +```swift +func averageOfLevels(_ root: TreeNode?) -> [Double] { + var res = [Double]() + guard let root = root else { + return res + } + var queue = [TreeNode]() + queue.append(root) + while !queue.isEmpty { + let size = queue.count + var sum = 0 + for _ in 0 ..< size { + let node = queue.removeFirst() + sum += node.val + if let left = node.left { + queue.append(left) + } + if let right = node.right { + queue.append(right) + } + } + res.append(Double(sum) / Double(size)) + } + return res +} +``` + # 429.N叉树的层序遍历 [力扣题目链接](https://leetcode-cn.com/problems/n-ary-tree-level-order-traversal/) @@ -981,6 +1092,31 @@ var levelOrder = function(root) { }; ``` +Swift: +```swift +func levelOrder(_ root: Node?) -> [[Int]] { + var res = [[Int]]() + guard let root = root else { + return res + } + var queue = [Node]() + queue.append(root) + while !queue.isEmpty { + let size = queue.count + var sub = [Int]() + for _ in 0 ..< size { + let node = queue.removeFirst() + sub.append(node.val) + for childNode in node.children { + queue.append(childNode) + } + } + res.append(sub) + } + return res +} +``` + # 515.在每个树行中找最大值 [力扣题目链接](https://leetcode-cn.com/problems/find-largest-value-in-each-tree-row/) @@ -1136,6 +1272,36 @@ var largestValues = function(root) { }; ``` +Swift: +```swift +func largestValues(_ root: TreeNode?) -> [Int] { + var res = [Int]() + guard let root = root else { + return res + } + var queue = [TreeNode]() + queue.append(root) + while !queue.isEmpty { + let size = queue.count + var max: Int = Int.min + for _ in 0 ..< size { + let node = queue.removeFirst() + if node.val > max { + max = node.val + } + if let left = node.left { + queue.append(left) + } + if let right = node.right { + queue.append(right) + } + } + res.append(max) + } + return res +} +``` + # 116.填充每个节点的下一个右侧节点指针 [力扣题目链接](https://leetcode-cn.com/problems/populating-next-right-pointers-in-each-node/) @@ -1338,6 +1504,37 @@ func connect(root *Node) *Node { } ``` +Swift: +```swift +func connect(_ root: Node?) -> Node? { + guard let root = root else { + return nil + } + var queue = [Node]() + queue.append(root) + while !queue.isEmpty { + let size = queue.count + var preNode: Node? + for i in 0 ..< size { + let node = queue.removeFirst() + if i == 0 { + preNode = node + } else { + preNode?.next = node + preNode = node + } + if let left = node.left { + queue.append(left) + } + if let right = node.right { + queue.append(right) + } + } + } + return root +} +``` + # 117.填充每个节点的下一个右侧节点指针II [力扣题目链接](https://leetcode-cn.com/problems/populating-next-right-pointers-in-each-node-ii/) @@ -1532,6 +1729,38 @@ func connect(root *Node) *Node { return root } ``` + +Swift: +```swift +func connect(_ root: Node?) -> Node? { + guard let root = root else { + return nil + } + var queue = [Node]() + queue.append(root) + while !queue.isEmpty { + let size = queue.count + var preNode: Node? + for i in 0 ..< size { + let node = queue.removeFirst() + if i == 0 { + preNode = node + } else { + preNode?.next = node + preNode = node + } + if let left = node.left { + queue.append(left) + } + if let right = node.right { + queue.append(right) + } + } + } + return root +} +``` + # 104.二叉树的最大深度 [力扣题目链接](https://leetcode-cn.com/problems/maximum-depth-of-binary-tree/) @@ -1704,6 +1933,31 @@ var maxDepth = function(root) { }; ``` +Swift: +```swift +func maxDepth(_ root: TreeNode?) -> Int { + guard let root = root else { + return 0 + } + var queue = [TreeNode]() + queue.append(root) + var res: Int = 0 + while !queue.isEmpty { + for _ in 0 ..< queue.count { + let node = queue.removeFirst() + if let left = node.left { + queue.append(left) + } + if let right = node.right { + queue.append(right) + } + } + res += 1 + } + return res +} +``` + # 111.二叉树的最小深度 [力扣题目链接](https://leetcode-cn.com/problems/minimum-depth-of-binary-tree/) @@ -1876,7 +2130,33 @@ var minDepth = function(root) { }; ``` - +Swift: +```swift +func minDepth(_ root: TreeNode?) -> Int { + guard let root = root else { + return 0 + } + var res = 0 + var queue = [TreeNode]() + queue.append(root) + while !queue.isEmpty { + res += 1 + for _ in 0 ..< queue.count { + let node = queue.removeFirst() + if node.left == nil && node.right == nil { + return res + } + if let left = node.left { + queue.append(left) + } + if let right = node.right { + queue.append(right) + } + } + } + return res +} +``` # 总结