8000 LeetCode-1/098. Recover Binary Search Tree at master · xiaokai1996/LeetCode-1 · GitHub
[go: up one dir, main page]

Skip to content
{"payload":{"allShortcutsEnabled":false,"path":"098. Recover Binary Search Tree","repo":{"id":198780537,"defaultBranch":"master","name":"LeetCode-1","ownerLogin":"xiaokai1996","currentUserCanPush":false,"isFork":true,"isEmpty":false,"createdAt":"2019-07-25T07:28:02.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/44293494?v=4","public":true,"private":false,"isOrgOwned":false},"currentUser":null,"refInfo":{"name":"master","listCacheKey":"v0:1633565888.734648","canEdit":false,"refType":"branch","currentOid":"1756256d7e619164076bbf358c8f7ca68cd8bd79"},"tree":{"items":[{"name":"README.md","path":"098. Recover Binary Search Tree/README.md","contentType":"file"},{"name":"main.cpp","path":"098. Recover Binary Search Tree/main.cpp","contentType":"file"},{"name":"solution.h","path":"098. Recover Binary Search Tree/solution.h","contentType":"file"}],"templateDirectorySuggestionUrl":null,"readme":{"displayName":"README.md","richText":"\u003carticle class=\"markdown-body entry-content container-lg\" itemprop=\"text\"\u003e\u003cp dir=\"auto\"\u003e可以结合一下 [86. Validate Binary Search Tree](../86. Validate Binary Search Tree), 至少要清楚 BST 的概念。\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e就本质而言,BST 的核心特质就是\u003cstrong\u003e有序\u003c/strong\u003e。何谓有序?最直接的方式就是将 BST 按照 Inorder 的遍历思想下落,落下来的序列是有序的。\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e3\n/ \u003cbr\u003e\n1 5\n/ \\ / \u003cbr\u003e\n0 2 4 6\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e0 1234 5 6 -\u0026gt; ordered\u003c/p\u003e\n\u003chr\u003e\n\u003cp dir=\"auto\"\u003e回到这道题,让我们 recover 这个 BST, 是因为某一次的 swap 出了错,关键是要理解 swap 出了什么错。提到 two elements, 再结合上面温习的基础概念,可以推测出,这两个 elements 待在了不该待的位置。我们 recover 的目的便是将这两个放错地方的 elements 对调过来。\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e题目又说了,不能动 BST 的结构,那么所谓的对调,便是针对值的对调。所以大致可以分为两个步骤:\u003c/p\u003e\n\u003col dir=\"auto\"\u003e\n\u003cli\u003efind two error elements.\u003c/li\u003e\n\u003cli\u003eswap two elements' values.\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp dir=\"auto\"\u003e对于第二步,非常 easy, 我们有 \u003ccode\u003estd::swap\u003c/code\u003e. 但是对于第一条,我们该如何查找,首先就应该想到是 DFS.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e在 [77. Construct Binary Tree from Inorder and Postorder Traversal](../77. Construct Binary Tree from Inorder and Postorder Traversal) 中我们曾总结,对于二叉树来说,DFS 有三种方式:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e先序遍历(先根遍历)\u003c/li\u003e\n\u003cli\u003e中序遍历(中根遍历)\u003c/li\u003e\n\u003cli\u003e后续遍历(后根遍历)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003e我们这道题的目的是查出哪里违反了 BST 的次序,正如最开始所说,最直接的方式是通过中序遍历的方式查看序列是否有序。那么我们显然应该选择中序遍历的 DFS 方法。\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e写出最简单的中序遍历:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-c++ notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"void InorderTraversal(TreeNode *root)\n{\n if (root == NULL) return;\n InorderTraversal(root-\u0026gt;left);\n cout \u0026lt;\u0026lt; root-\u0026gt;val \u0026lt;\u0026lt; \u0026quot; \u0026quot;;\n InorderTraversal(root-\u0026gt;right);\n}\"\u003e\u003cpre\u003e\u003cspan class=\"pl-k\"\u003evoid\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eInorderTraversal\u003c/span\u003e(TreeNode *root)\n{\n \u003cspan class=\"pl-k\"\u003eif\u003c/span\u003e (root == \u003cspan class=\"pl-c1\"\u003eNULL\u003c/span\u003e) \u003cspan class=\"pl-k\"\u003ereturn\u003c/span\u003e;\n \u003cspan class=\"pl-c1\"\u003eInorderTraversal\u003c/span\u003e(root-\u0026gt;\u003cspan class=\"pl-smi\"\u003eleft\u003c/span\u003e);\n cout \u0026lt;\u0026lt; root-\u0026gt;\u003cspan class=\"pl-smi\"\u003eval\u003c/span\u003e \u0026lt;\u0026lt; \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e \u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e;\n \u003cspan class=\"pl-c1\"\u003eInorderTraversal\u003c/span\u003e(root-\u0026gt;\u003cspan class=\"pl-smi\"\u003eright\u003c/span\u003e);\n}\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e然后,考虑我们的需求,要找到两个元素,而找的条件是次序不符,如何叫次序不符?\u003cstrong\u003e先遍历出来的元素 \u0026gt; 后遍历出来的元素\u003c/strong\u003e,即为不符。\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e显然,我们需要三个指针来协助:\u003ccode\u003efirst\u003c/code\u003e, \u003ccode\u003esecond\u003c/code\u003e, \u003ccode\u003eprev\u003c/code\u003e, 分别代表第一个元素,第二个元素,上一个元素。\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e当出现 \u003ccode\u003eprev-\u0026gt;val \u0026gt; root-\u0026gt;val\u003c/code\u003e 时,表示找到不符的元素。若是第一个,则为 first. 无论是不是,都将当前的 root 赋给 second, 因为可能会出现仅有两个节点的情况(仅仅遍历一次,second 无法获取应得的值). 这部分逻辑为:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-c++ notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"if (first == NULL) first = prev;\nsecond = root;\"\u003e\u003cpre\u003e\u003cspan class=\"pl-k\"\u003eif\u003c/span\u003e (first == \u003cspan class=\"pl-c1\"\u003eNULL\u003c/span\u003e) first = prev;\nsecond = root;\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e然后,便没有太多可说的了。总体来说,本题难度不大。\u003c/p\u003e\n\u003c/article\u003e","errorMessage":null,"headerInfo":{"toc":[],"siteNavLoginPath":"/login?return_to=https%3A%2F%2Fgithub.com%2Fxiaokai1996%2FLeetCode-1%2Ftree%2Fmaster%2F098.%2520Recover%2520Binary%2520Search%2520Tree"}},"totalCount":3,"showBranchInfobar":true},"fileTree":{"":{"items":[{"name":"000. Two Sum","path":"000. Two Sum","contentType":"directory"},{"name":"001. Add Two Numbers","path":"001. Add Two Numbers","contentType":"directory"},{"name":"002. Longest Substring Without Repeating Characters","path":"002. Longest Substring Without Repeating Characters","contentType":"directory"},{"name":"004. Longest Palindromic Substring","path":"004. Longest Palindromic Substring","contentType":"directory"},{"name":"005. ZigZag Conversion","path":"005. ZigZag Conversion","contentType":"directory"},{"name":"006. Reverse Integer","path":"006. Reverse Integer","contentType":"directory"},{"name":"007. Linked List Cycle","path":"007. Linked List Cycle","contentType":"directory"},{"name":"008. Palindrome Number","path":"008. Palindrome Number","contentType":"directory"},{"name":"009. Regular Expression Matching","path":"009. Regular Expression Matching","contentType":"directory"},{"name":"010. Container With Most Water","path":"010. Container With Most Water","contentType":"directory"},{"name":"011. Integer to Roman","path":"011. Integer to Roman","contentType":"directory"},{"name":"012. Roman to Integer","path":"012. Roman to Integer","contentType":"directory"},{"name":"013. Longest Common Prefix","path":"013. Longest Common Prefix","contentType":"directory"},{"name":"015. 3Sum Closest","path":"015. 3Sum Closest","contentType":"directory"},{"name":"016. Letter Combinations of a Phone Number","path":"016. Letter Combinations of a Phone Number","contentType":"directory"},{"name":"017. 4Sum","path":"017. 4Sum","contentType":"directory"},{"name":"018. Remove Nth Node from End of List","path":"018. Remove Nth Node from End of List","contentType":"directory"},{"name":"019. Valid Parentheses","path":"019. Valid Parentheses","contentType":"directory"},{"name":"020. Merge Two Sorted Lists","path":"020. Merge Two Sorted Lists","contentType":"directory"},{"name":"021. Generate Parentheses","path":"021. Generate Parentheses","contentType":"directory"},{"name":"022. Merge k Sorted Lists","path":"022. Merge k Sorted Lists","contentType":"directory"},{"name":"023. Swap Nodes in Pairs","path":"023. Swap Nodes in Pairs","contentType":"directory"},{"name":"024. Reverse Nodes in k-Group","path":"024. Reverse Nodes in k-Group","contentType":"directory"},{"name":"025. Remove Duplicates from Sorted Array","path":"025. Remove Duplicates from Sorted Array","contentType":"directory"},{"name":"026. Remove Element","path":"026. Remove Element","contentType":"directory"},{"name":"027. Implement strStr()","path":"027. Implement strStr()","contentType":"directory"},{"name":"030. Next Permutation","path":"030. Next Permutation","contentType":"directory"},{"name":"032. Search in Rotated Sorted Array","path":"032. Search in Rotated Sorted Array","contentType":"directory"},{"name":"033. Search for a Range","path":"033. Search for a Range","contentType":"directory"},{"name":"034. Search Insert Position","path":"034. Search Insert Position","contentType":"directory"},{"name":"035. Valid Sudoku","path":"035. Valid Sudoku","contentType":"directory"},{"name":"036. Sudoku Solver","path":"036. Sudoku Solver","contentType":"directory"},{"name":"037. Count and Say","path":"037. Count and Say","contentType":"directory"},{"name":"038. Combination Sum","path":"038. Combination Sum","contentType":"directory"},{"name":"039. Combination Sum II","path":"039. Combination Sum II","contentType":"directory"},{"name":"040. First Missing Positive","path":"040. First Missing Positive","contentType":"directory"},{"name":"041. Trapping Rain Water","path":"041. Trapping Rain Water","contentType":"directory"},{"name":"042. Multiply Strings","path":"042. Multiply Strings","contentType":"directory"},{"name":"044. Jump Game II","path":"044. Jump Game II","contentType":"directory"},{"name":"045. Permutations","path":"045. Permutations","contentType":"directory"},{"name":"046. Permutations II","path":"046. Permutations II","contentType":"directory"},{"name":"047. Rotate Image","path":"047. Rotate Image","contentType":"directory"},{"name":"048. Group Anagrams","path":"048. Group Anagrams","contentType":"directory"},{"name":"049. Pow(x, n)","path":"049. Pow(x, n)","contentType":"directory"},{"name":"050. N-Queens","path":"050. N-Queens","contentType":"directory"},{"name":"051. N-Queens II","path":"051. N-Queens II","contentType":"directory"},{"name":"052. Maximum Subarray","path":"052. Maximum Subarray","contentType":"directory"},{"name":"053. Spiral Matrix","path":"053. Spiral Matrix","contentType":"directory"},{"name":"054. Jump Game","path":"054. Jump Game","contentType":"directory"},{"name":"055. Merge Intervals","path":"055. Merge Intervals","contentType":"directory"},{"name":"056. Insert Interval","path":"056. Insert Interval","contentType":"directory"},{"name":"057. Length of Last Word","path":"057. Length of Last Word","contentType":"directory"},{"name":"058. Spiral Matrix II","path":"058. Spiral Matrix II","contentType":"directory"},{"name":"059. Permutation Sequence","path":"059. Permutation Sequence","contentType":"directory"},{"name":"060. Rotate List","path":"060. Rotate List","contentType":"directory"},{"name":"061. Unique Paths","path":"061. Unique Paths","contentType":"directory"},{"name":"062. Unique Paths II","path":"062. Unique Paths II","contentType":"directory"},{"name":"063. Minimum Path Sum","path":"063. Minimum Path Sum","contentType":"directory"},{"name":"065. Plus One","path":"065. Plus One","contentType":"directory"},{"name":"066. Add Binary","path":"066. Add Binary","contentType":"directory"},{"name":"068. Sqrt(x)","path":"068. Sqrt(x)","contentType":"directory"},{"name":"069. Climbing Stairs","path":"069. Climbing Stairs","contentType":"directory"},{"name":"070. Simplify Path","path":"070. Simplify Path","contentType":"directory"},{"name":"071. Edit Distance","path":"071. Edit Distance","contentType":"directory"},{"name":"072. Set Matrix Zeroes","path":"072. Set Matrix Zeroes","contentType":"directory"},{"name":"073. Search a 2D Matrix","path":"073. Search a 2D Matrix","contentType":"directory"},{"name":"074. Sort Colors","path":"074. Sort Colors","contentType":"directory"},{"name":"076. Combinations","path":"076. Combinations","contentType":"directory"},{"name":"077. Subsets","path":"077. Subsets","contentType":"directory"},{"name":"079. Remove Duplicates from Sorted Array II","path":"079. Remove Duplicates from Sorted Array II","contentType":"directory"},{"name":"080. Search in Rotated Sorted Array II","path":"080. Search in Rotated Sorted Array II","contentType":"directory"},{"name":"081. Remove Duplicates from Sorted List II","path":"081. Remove Duplicates from Sorted List II","contentType":"directory"},{"name":"082. Remove Duplicates from Sorted List","path":"082. Remove Duplicates from Sorted List","contentType":"directory"},{"name":"083. Largest Rectangle in Histogram","path":"083. Largest Rectangle in Histogram","contentType":"directory"},{"name":"084. Maximal Rectangle","path":"084. Maximal Rectangle","contentType":"directory"},{"name":"085. Partition List","path":"085. Partition List","contentType":"directory"},{"name":"086. Scramble String","path":"086. Scramble String","contentType":"directory"},{"name":"087. Merge Sorted Array","path":"087. Merge Sorted Array","contentType":"directory"},{"name":"088. Gray Code","path":"088. Gray Code","contentType":"directory"},{"name":"089. Subsets II","path":"089. Subsets II","contentType":"directory"},{"name":"090. Insertion Sort List","path":"090. Insertion Sort List","contentType":"directory"},{"name":"091. Reverse Linked List II","path":"091. Reverse Linked List II","contentType":"directory"},{"name":"092. Restore IP Addresses","path":"092. Restore IP Addresses","contentType":"directory"},{"name":"093. Binary Tree Inorder Traversal","path":"093. Binary Tree Inorder Traversal","contentType":"directory"},{"name":"094. Unique Binary Search Trees II","path":"094. Unique Binary Search Trees II","contentType":"directory"},{"name":"095. Unique Binary Search Trees","path":"095. Unique Binary Search Trees","contentType":"directory"},{"name":"097. Validate Binary Search Tree","path":"097. Validate Binary Search Tree","contentType":"directory"},{"name":"098. Recover Binary Search Tree","path":"098. Recover Binary Search Tree","contentType":"directory"},{"name":"099. Same Tree","path":"099. Same Tree","contentType":"directory"},{"name":"100. Symmetric Tree","path":"100. Symmetric Tree","contentType":"directory"},{"name":"101. Binary Tree Level Order Traversal","path":"101. Binary Tree Level Order Traversal","contentType":"directory"},{"name":"102. Binary Tree Zigzag Level Order Traversal","path":"102. Binary Tree Zigzag Level Order Traversal","contentType":"directory"},{"name":"103. Maximum Depth of Binary Tree","path":"103. Maximum Depth of Binary Tree","contentType":"directory"},{"name":"104. Construct Binary Tree from Preorder and Inorder Traversal","path":"104. Construct Binary Tree from Preorder and Inorder Traversal","contentType":"directory"},{"name":"105. Construct Binary Tree from Inorder and Postorder Traversal","path":"105. Construct Binary Tree from Inorder and Postorder Traversal","contentType":"directory"},{"name":"106. Binary Tree Level Order Traversal II","path":"106. Binary Tree Level Order Traversal II","contentType":"directory"},{"name":"107. Convert Sorted Array to Binary Search Tree","path":"107. Convert Sorted Array to Binary Search Tree","contentType":"directory"},{"name":"108. Convert Sorted List to Binary Search Tree","path":"108. Convert Sorted List to Binary Search Tree","contentType":"directory"},{"name":"109. Balanced Binary Tree","path":"109. Balanced Binary Tree","contentType":"directory"},{"name":"110. Minimum Depth of Binary Tree","path":"110. Minimum Depth of Binary Tree","contentType":"directory"},{"name":"111. Path Sum","path":"111. Path Sum","contentType":"directory"},{"name":"112. Path Sum II","path":"112. Path Sum II","contentType":"directory"},{"name":"113. Flatten Binary Tree to Linked List","path":"113. Flatten Binary Tree to Linked List","contentType":"directory"},{"name":"114. Distinct Subsequences","path":"114. Distinct Subsequences","contentType":"directory"},{"name":"115. Populating Next Right Pointers in Each Node","path":"115. Populating Next Right Pointers in Each Node","contentType":"directory"},{"name":"116. Populating Next Right Pointers in Each Node II","path":"116. Populating Next Right Pointers in Each Node II","contentType":"directory"},{"name":"117. Pascal's Triangle","path":"117. Pascal's Triangle","contentType":"directory"},{"name":"118. Pascal's Triangle II","path":"118. Pascal's Triangle II","contentType":"directory"},{"name":"119. Triangle","path":"119. Triangle","contentType":"directory"},{"name":"120. Best Time to Buy and Sell Stock","path":"120. Best Time to Buy and Sell Stock","contentType":"directory"},{"name":"121. Best Time to Buy and Sell Stock II","path":"121. Best Time to Buy and Sell Stock II","contentType":"directory"},{"name":"122. Best Time to Buy and Sell Stock III","path":"122. Best Time to Buy and Sell Stock III","contentType":"directory"},{"name":"122. Sort List","path":"122. Sort List","contentType":"directory"},{"name":"123. Binary Tree Maximum Path Sum","path":"123. Binary Tree Maximum Path Sum","contentType":"directory"},{"name":"124. Valid Palindrome","path":"124. Valid Palindrome","contentType":"directory"},{"name":"125. Reorder List","path":"125. Reorder List","contentType":"directory"},{"name":"127. Longest Consecutive Sequence","path":"127. Longest Consecutive Sequence","contentType":"directory"},{"name":"128. Sum Root to Leaf Numbers","path":"128. Sum Root to Leaf Numbers","contentType":"directory"},{"name":"130. Palindrome Partitioning","path":"130. Palindrome Partitioning","contentType":"directory"},{"name":"132. Clone Graph","path":"132. Clone Graph","contentType":"directory"},{"name":"133. Gas Station","path":"133. Gas Station","contentType":"directory"},{"name":"135. Single Number","path":"135. Single Number","contentType":"directory"},{"name":"136. Single Number II","path":"136. Single Number II","contentType":"directory"},{"name":"137. Copy List with Random Pointer","path":"137. Copy List with Random Pointer","contentType":"directory"},{"name":"138. Word Break","path":"138. Word Break","contentType":"directory"},{"name":"141. Linked List Cycle II","path":"141. Linked List Cycle II","contentType":"directory"},{"name":"143. Binary Tree Preorder Traversal","path":"143. Binary Tree Preorder Traversal","contentType":"directory"},{"name":"144. Binary Tree Postorder Traversal","path":"144. Binary Tree Postorder Traversal","contentType":"directory"},{"name":"152. Find Minimum in Rotated Sorted Array","path":"152. Find Minimum in Rotated Sorted Array","contentType":"directory"},{"name":"435. Find All Duplicates in an Array","path":"435. Find All Duplicates in an Array","contentType":"directory"},{"name":"619. Maximum Average Subarray I","path":"619. Maximum Average Subarray I","contentType":"directory"},{"name":"630. Maximum Binary Tree","path":"630. Maximum Binary Tree","contentType":"directory"},{"name":"Catch","path":"Catch","contentType":"submodule","submoduleUrl":"/catchorg/Catch2/tree/d4e5f184369ce34592bb6f89e793bdb22d1d011a","submoduleDisplayName":"Catch @ d4e5f18"},{"name":".gitignore","path":".gitignore","contentType":"file"},{"name":".gitmodules","path":".gitmodules","contentType":"file"},{"name":"LICENSE","path":"LICENSE","contentType":"file"},{"name":"README.md","path":"README.md","contentType":"file"}],"totalCount":137}},"fileTreeProcessingTime":149.581151,"foldersToFetch":[],"treeExpanded":true,"symbolsExpanded":false,"csrf_tokens":{"/xiaokai1996/LeetCode-1/branches":{"post":"4BtSl3fl_bKir8H_VkNMdl9L5_Ok5IGcjYZXG7rY_UoFQFFM1BBLw1IA6tdH67RbB5bCrSAKj52_yyKEjDK0tA"},"/xiaokai1996/LeetCode-1/branches/fetch_and_merge/master":{"post":"wERHTW7Z9emSC3HFQmkcIOanH8XIUT5fbN0Dz1Xkcz0nkF3iCV4f45Msmsjz0-J1HNlmJdPMvLprKS1lrmYjAw"},"/xiaokai1996/LeetCode-1/branches/fetch_and_merge/master?discard_changes=true":{"post":"8379mg5eLVHDW-C1uAHMFXi70Z4_d9emLV8GD0SoUOUUquc1adnHW8J8C7gJuzJAgsWofiTqVUMqqyilvyoA2w"}}},"title":"LeetCode-1/098. Recover Binary Search Tree at master · xiaokai1996/LeetCode-1","appPayload":{"helpUrl":"https://docs.github.com","findFileWorkerPath":"/assets-cdn/worker/find-file-worker-263cab1760dd.js","findInFileWorkerPath":"/assets-cdn/worker/find-in-file-worker-1b17b3e7786a.js","githubDevUrl":null,"enabled_features":{"code_nav_ui_events":false,"react_blob_overlay":false,"accessible_code_button":true}}}
0