Skip to content
Open
7 changes: 7 additions & 0 deletions .swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

40 changes: 24 additions & 16 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,34 +16,42 @@ swift run LeetCode_ addDigits

## Solved

- [581. Shortest Unsorted Continuous Subarray](https://leetcode.com/problems/shortest-unsorted-continuous-subarray/) · [Submission](Sources/LeetCode_/581.ShortestUnsortedContinuousSubarray/ShortestUnsortedContinuousSubarray.swift)
- [581. Shortest Unsorted Continuous Subarray](https://leetcode.com/problems/shortest-unsorted-continuous-subarray/) · [Submission](Sources/LeetCode_/LeetCode/581.ShortestUnsortedContinuousSubarray/ShortestUnsortedContinuousSubarray.swift)

- [258. Add Digits](https://leetcode.com/problems/add-digits/) · [Submission](Sources/LeetCode_/258.AddDigits/AddDigits.swift)
- [258. Add Digits](https://leetcode.com/problems/add-digits/) · [Submission](Sources/LeetCode_/LeetCode/258.AddDigits/AddDigits.swift)

- [453. Minimum Moves to Equal Array Elements](https://leetcode.com/problems/minimum-moves-to-equal-array-elements/) · [Submission](Sources/LeetCode_/453.MinimumMovesToEqualArrayElements/MinimumMovesToEqual.swift)
- [453. Minimum Moves to Equal Array Elements](https://leetcode.com/problems/minimum-moves-to-equal-array-elements/) · [Submission](Sources/LeetCode_/LeetCode/453.MinimumMovesToEqualArrayElements/MinimumMovesToEqual.swift)

- [665. Non-decreasing Array](https://leetcode.com/problems/non-decreasing-array/) · [Submission](Sources/LeetCode_/665.Non-decreasingArray/NonDecreasing.swift)
- [665. Non-decreasing Array](https://leetcode.com/problems/non-decreasing-array/) · [Submission](Sources/LeetCode_/LeetCode/665.Non-decreasingArray/NonDecreasing.swift)

- [125. Valid Palindrome](https://leetcode.com/problems/valid-palindrome/) · [Submission](Sources/LeetCode_/125.ValidPalindrome/ValidPalindrome.swift)
- [125. Valid Palindrome](https://leetcode.com/problems/valid-palindrome/) · [Submission](Sources/LeetCode_/LeetCode/125.ValidPalindrome/ValidPalindrome.swift)

- [832. Flipping an Image](https://leetcode.com/problems/flipping-an-image/) · [Submission](Sources/LeetCode_/832.FlippingAnImage/FlippingAnImage.swift)
- [832. Flipping an Image](https://leetcode.com/problems/flipping-an-image/) · [Submission](Sources/LeetCode_/LeetCode/832.FlippingAnImage/FlippingAnImage.swift)

- [628. Maximum Product of Three Numbers](https://leetcode.com/problems/maximum-product-of-three-numbers/) · [Submission](Sources/LeetCode_/628.MaximumProductOfThreeNumbers/MaximumProductOfThreeNumbers.swift)
- [628. Maximum Product of Three Numbers](https://leetcode.com/problems/maximum-product-of-three-numbers/) · [Submission](Sources/LeetCode_/LeetCode/628.MaximumProductOfThreeNumbers/MaximumProductOfThreeNumbers.swift)

- [575. Distribute Candies](https://leetcode.com/problems/distribute-candies/) · [Submission](Sources/LeetCode_/575.DistributeCandies/DistributeCandies.swift)
- [575. Distribute Candies](https://leetcode.com/problems/distribute-candies/) · [Submission](Sources/LeetCode_/LeetCode/575.DistributeCandies/DistributeCandies.swift)

- [872. Leaf-Similar Trees](https://leetcode.com/problems/leaf-similar-trees/) · [Submission](Sources/LeetCode_/872.Leaf-SimilarTrees/Leaf-SimilarTrees.swift)
- [872. Leaf-Similar Trees](https://leetcode.com/problems/leaf-similar-trees/) · [Submission](Sources/LeetCode_/LeetCode/872.Leaf-SimilarTrees/Leaf-SimilarTrees.swift)

- [495. Teemo Attacking](https://leetcode.com/problems/teemo-attacking/) · [Submission](Sources/LeetCode_/495.TeemoAttacking/TeemoAttacking.swift)
- [495. Teemo Attacking](https://leetcode.com/problems/teemo-attacking/) · [Submission](Sources/LeetCode_/LeetCode/495.TeemoAttacking/TeemoAttacking.swift)

- [088. Merge Sorted Array](https://leetcode-cn.com/problems/merge-sorted-array/) · [Submission](Sources/LeetCode_/088.MergeSortedArray/MergeSortedArray.swift)
- [088. Merge Sorted Array](https://leetcode-cn.com/problems/merge-sorted-array/) · [Submission](Sources/LeetCode_/LeetCode/088.MergeSortedArray/MergeSortedArray.swift)

- [209. Minimum Size Subarray Sum](https://leetcode.com/problems/minimum-size-subarray-sum/) · [Submission](Sources/LeetCode_/209.MinimumSizeSubarraySum/MinimumSizeSubarraySum.swift)
- [209. Minimum Size Subarray Sum](https://leetcode.com/problems/minimum-size-subarray-sum/) · [Submission](Sources/LeetCode_/LeetCode/209.MinimumSizeSubarraySum/MinimumSizeSubarraySum.swift)

- [014. Longest Common Prefix](https://leetcode.com/problems/longest-common-prefix/) · [Submission](Sources/LeetCode_/014.LongestCommonPrefix/LongestCommonPrefix.swift)
- [014. Longest Common Prefix](https://leetcode.com/problems/longest-common-prefix/) · [Submission](Sources/LeetCode_/LeetCode/014.LongestCommonPrefix/LongestCommonPrefix.swift)

- [881. Boats to Save People](https://leetcode.com/problems/boats-to-save-people/) · [Submission](Sources/LeetCode_/881.BoatstoSavePeople/BoatstoSavePeople.swift)
- [881. Boats to Save People](https://leetcode.com/problems/boats-to-save-people/) · [Submission](Sources/LeetCode_/LeetCode/881.BoatstoSavePeople/BoatstoSavePeople.swift)

- [376. Wiggle Subsequence](https://leetcode.com/problems/wiggle-subsequence/) · [Submission](Sources/LeetCode_/LeetCode/376.WiggleSubsequence/WiggleSubsequence.swift)

- [229. Majority Element II](https://leetcode.com/problems/majority-element-ii/) · [Submission](Sources/LeetCode_/LeetCode/229.MajorityElementII/MajorityElementII.swift)

##

- [Binary Tree](Sources/LeetCode_/BinaryTree/BinaryTree.swift)

- [Binary Search Tree](Sources/LeetCode_/BinaryTree/BinarySearchTree.swift)

- [376. Wiggle Subsequence](https://leetcode.com/problems/wiggle-subsequence/) · [Submission](Sources/LeetCode_/376.WiggleSubsequence/WiggleSubsequence.swift)

- [229. Majority Element II](https://leetcode.com/problems/majority-element-ii/) · [Submission](Sources/LeetCode_/229.MajorityElementII/MajorityElementII.swift)
167 changes: 167 additions & 0 deletions Sources/LeetCode_/BinaryTree/BinarySearchTree.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,167 @@
//
// File.swift
//
//
// Created by 韩元旭 on 2020/6/9.
//

import Foundation

// MARK: - 修剪二叉搜索树
/// https://leetcode-cn.com/problems/trim-a-binary-search-tree/
extension Solution {

// 给定一个二叉搜索树,同时给定最小边界L 和最大边界 R。通过修剪二叉搜索树,使得所有节点的值在[L, R]中 (R>=L)

/// 修剪二叉搜索树
func trimBST(_ root: TreeNode?, _ L: Int, _ R: Int) -> TreeNode? {
guard let tree = root else { return nil }
if tree.val > R {
return trimBST(tree.left, L, R)
}
if tree.val < L {
return trimBST(tree.right, L, R)
}
tree.left = trimBST(tree.left, L, R)
tree.right = trimBST(tree.right, L, R)
return tree
}

}

// MARK: - 把二叉搜索树转换为累加树
/// https://leetcode-cn.com/problems/convert-bst-to-greater-tree/
extension Solution {

// 使得每个节点的值是原来的节点值加上所有大于它的节点值之和。

/// 把二叉搜索树转换为累加树 - 反序中序遍历
func convertBST(_ root: TreeNode?) -> TreeNode? {
var sum: Int = 0

func rec(_ root: TreeNode?) {
guard let tree = root else { return }
rec(tree.right)
sum += tree.val
tree.val = sum
rec(tree.left)
}

rec(root)
return root
}

#warning("TODO LeetCode 上还有两种方法")

}


// MARK: - 二叉搜索树中的搜索
/// https://leetcode-cn.com/problems/search-in-a-binary-search-tree/
extension Solution {

// 返回以该节点为根的子树。 如果节点不存在,则返回 NULL

/// 二叉搜索树中的搜索
func searchBST(_ root: TreeNode?, _ val: Int) -> TreeNode? {
guard let tree = root else { return nil }
if val == tree.val {
return tree
} else if val > tree.val {
return searchBST(tree.right, val)
} else {
return searchBST(tree.left, val)
}
}

/// 二叉搜索树中的搜索 - 迭代
func searchBST_BFS(_ root: TreeNode?, _ val: Int) -> TreeNode? {
var tree = root
while tree != nil && tree?.val != val {
tree = tree!.val > val ? tree?.left : tree?.right
}
return tree
}

}


// MARK: - 二叉搜索树的范围和
/// https://leetcode-cn.com/problems/range-sum-of-bst/
extension Solution {

// 返回 L 和 R(含)之间的所有结点的值的和

/// 二叉搜索树的范围和
func rangeSumBST(_ root: TreeNode?, _ L: Int, _ R: Int) -> Int {
var sum = 0

func rec(_ root: TreeNode?) {
guard let tree = root else { return }
if L <= tree.val && tree.val <= R{
sum += tree.val
}

if L < tree.val {
rec(tree.left)
}

if tree.val < R {
rec(tree.right)
}
}

rec(root)
return sum
}

/// 二叉搜索树的范围和
func rangeSumBST_BFS(_ root: TreeNode?, _ L: Int, _ R: Int) -> Int {
guard let tree = root else { return 0 }
var sum = 0
var stack = [tree]
while !stack.isEmpty {
guard let node = stack.popLast() else { break }
if L <= node.val && node.val <= R{
sum += node.val
}

if let left = node.left, L < node.val {
stack.append(left)
}

if let right = node.right, node.val < R {
stack.append(right)
}
}
return sum
}

}

// MARK: - 二叉搜索树的第k大节点
/// https://leetcode-cn.com/problems/er-cha-sou-suo-shu-de-di-kda-jie-dian-lcof/
extension Solution {

// Tips 中序遍历是递增序列
// 根据以上性质,易得二叉搜索树的“中序遍历倒序”为 递减序列 。

// 二叉搜索树的第k大节点
func kthLargest(_ root: TreeNode?, _ k: Int) -> Int {
var value = -1
var count = k

func rec(_ root: TreeNode?) {
guard let tree = root else { return }
rec(tree.right)
if count == 0 { return }
count -= 1
if count == 0 { value = tree.val }
rec(tree.left)
}

rec(root)
return value
}

}
Loading