问题描述:
Two elements of a binary search tree (BST) are swapped by mistake.
Recover the tree without changing its structure.
Note:
A solution using O(n) space is pretty straight forward. Could you devise a constant space solution?
原问题链接:https://leetcode.com/problems/recover-binary-search-tree/
问题分析
对于一棵二叉搜索树来说,如果它里面有两个节点的位置发生了交换,那么从它本身的性质来说,它这两个交换后的节点可能会出现每个节点在新的位置和它的左右子节点之间关系不符合原来的定义了。
这个时候,一个二叉搜索树的重要性质可以在这里起到大的作用。对于它来说,如果进行中序遍历的话,得到的结果是一个排序后递增的序列。可是如果我们交换了其中两个元素的话,里面就会有两个元素不符合递增的特性。
所以,我们可以通过中序遍历的时候将遍历过的所有元素加入到一个列表中。然后在结果列表里查找这两个元素就可以了。
那么,该怎么找这两个元素呢?因为交换了这两个元素之后,必然是一个大的元素放到了前面而一个小的元素放到了后面。所以我们从列表的第二个元素开始,每次比较当前元素和它的前一个元素。如果前一个元素比当前元素大,说明找到了这个大的元素。所以我们找到的第一个不符合条件的元素就是那个从后面被交换到前面的元素。而那个被前面交换到后面的元素则是最后一个不符合递增属性的元素。
找到这两个元素之后,我们交换设置这两个元素的值就可以了。详细的代码实现如下:
/** * Definition for binary tree * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ public class Solution { public void recoverTree(TreeNode root) { List<TreeNode> list = new ArrayList<>(); traverse(root, list); int max = -1, min = -1; for(int i = 1; i < list.size(); i++) { if(list.get(i).val < list.get(i - 1).val) { max = i - 1; break; } } for(int i = max + 1; i < list.size(); i++) { if(list.get(i).val < list.get(i - 1).val) min = i; } if(max == -1 || min == -1) return; int temp = list.get(max).val; list.get(max).val = list.get(min).val; list.get(min).val = temp; } private void traverse(TreeNode node, List<TreeNode> list) { if(node == null) return; if(node.left != null) traverse(node.left, list); list.add(node); if(node.right != null) traverse(node.right, list); } }
相关推荐
lru缓存leetcode leetcode 大批 41. First Missing Positive 广度优先搜索 ...Recover Binary Search Tree 109. Convert Sorted List to Binary Search Tree 116. Populating Next Right Pointers in Each No
java java_leetcode-99-recover-binary-search-tree
python python_leetcode题解之099_Recover_Binary_Search_Tree
c语言基础 c语言_leetcode题解之0099_recover_binary_search_tree.zip
js js_leetcode题解之99-recover-binary-search-tree.js
- **Recover Binary Search Tree**:恢复二叉搜索树中的两个错误节点。 - **Binary Tree Path**:找到二叉树中和为目标值的路径。 - **Sum Root to Leaf Numbers**:计算二叉树所有从根到叶子节点的路径之和。 4...
* [Binary Search Tree](https://github.com/kamyu104/LeetCode#binary-search-tree) * [Breadth-First Search](https://github.com/kamyu104/LeetCode#breadth-first-search) * [Depth-First Search]...
Recover Binary Search Tree - Java Recursive 0101 Symmetric tree - Java Recursive - Java Iterative - C Recursive - Python Iterative 0102 Binary Tree Level Order Traversal - Python3 iterative 0103...
本篇内容将深入解析Python在LeetCode面试中的第99题——恢复二叉搜索树(Recover Binary Search Tree)。 二叉搜索树(Binary Search Tree,BST)是一种特殊的二叉树,它的每个节点都满足以下性质:左子树上所有...
- BinaryTree(二叉树) - HuffmanCompression(霍夫曼编码) - Queue(队列) - Heap(堆) - Stack(栈) - Set(集合) - Map(映射/哈希表) - Graph(图) - **Basics Sorting**(基本排序算法) - ...
接着,我们来看第9题,"恢复二叉搜索树的顺序"( Recover Binary Search Tree)。这道题要求恢复一棵二叉搜索树中两个节点的值,使得树重新符合二叉搜索树的性质。二叉搜索树的特点是左子树上的所有节点值小于父节点...
Recover a Tree From Preorder Traversal Hard (73.62 %) [1027] Longest Arithmetic Sequence Medium (41.26 %) [1026] Maximum Difference Between Node and Ancestor Medium (55.48 %) [1025] Divisor Game Easy ...