leetcode 之 Recover Binary Search Tree
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?
confused what "{1,#,2,3}"
means? >
read more on how binary tree is serialized on OJ.
class Solution {
public:
void recoverTree(TreeNode *root) {
if(root == NULL)return;
TreeNode* pre = NULL,*n1 = NULL,*n2 = NULL;
findTwoNode(root,n1,n2,pre);
if(n1 && n2)
{
int temp = n1->val;
n1->val = n2->val;
n2->val = temp;
}
}
void findTwoNode(TreeNode* root,TreeNode* &n1,TreeNode* &n2,TreeNode* &pre)
{
if(root == NULL)return;
findTwoNode(root->left,n1,n2,pre);
if(pre && pre->val > root->val)
{
n2 = root;//第二個出錯位置是該節點的後序
if(n1 == NULL)
{
n1 = pre;//第一個出錯位置是該節點的先序
}
}
pre = root;
findTwoNode(root->right,n1,n2,pre);
}
};
下面是堆疊實現,思路一樣:
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
class Solution {
public:
void recoverTree(TreeNode *root) {
if(!root)return;
stack<TreeNode*> s;
TreeNode* p = root , *pre = NULL ,*node1 = NULL,*node2 = NULL;
while(p || !s.empty())
{
while( p )
{
s.push(p);
p = p -> left;
}
p = s.top();
s.pop();
if(pre && pre -> val > p -> val)
{
if( !node1 )node1 = pre;
node2 = p;
}
pre = p;
p = p -> right;
}
if(node1 && node2) swap(node1 -> val,node2 -> val);
}
};
相關文章
- Recover Binary Search Tree leetcode javaLeetCodeJava
- Leetcode Validate Binary Search TreeLeetCode
- LeetCode-Closest Binary Search Tree ValueLeetCode
- Validate Binary Search Tree leetcode javaLeetCodeJava
- LeetCode 98. Validate Binary Search TreeLeetCode
- LeetCode-Closest Binary Search Tree Value IILeetCode
- 【LeetCode】Convert Sorted List to Binary Search TreeLeetCode
- Leetcode Convert Sorted Array to Binary Search TreeLeetCode
- Leetcode Convert Sorted List to Binary Search TreeLeetCode
- [leetcode]convert-sorted-array-to-binary-search-treeLeetCode
- [LeetCode] 501. Find Mode in Binary Search TreeLeetCode
- LeetCode 501. Find Mode in Binary Search TreeLeetCode
- Convert Sorted List to Binary Search Tree leetcode javaLeetCodeJava
- Convert Sorted Array to Binary Search Tree leetcode javaLeetCodeJava
- 173. Binary Search Tree Iterator
- LintCode-Search Range in Binary Search Tree
- Java for LeetCode 109 Convert Sorted List to Binary Search TreeJavaLeetCode
- [LeetCode] 109. Convert Sorted List to Binary Search TreeLeetCode
- 【Leetcode】109. Convert Sorted List to Binary Search TreeLeetCode
- LeetCode之Univalued Binary Tree(Kotlin)LeetCodeKotlin
- 501-Find Mode in Binary Search Tree
- LeetCode之Binary Tree Pruning(Kotlin)LeetCodeKotlin
- LeetCode之Increasing Order Search Tree(Kotlin)LeetCodeKotlin
- LintCode-Implement Iterator of Binary Search Tree
- LintCode-Remove node in Binary Search TreeREM
- Leetcode Binary Tree PathsLeetCode
- LeetCode Invert Binary TreeLeetCode
- Leetcode Balanced Binary TreeLeetCode
- Leetcode Unique Binary Search TreesLeetCode
- LeetCode-Binary Tree PathsLeetCode
- leetcode - Binary Tree Preorder TraversalLeetCode
- Leetcode Binary Tree Inorder TraversalLeetCode
- Leetcode Binary Tree Preorder TraversalLeetCode
- Leetcode Binary Tree Postorder TraversalLeetCode
- Leetcode Maximum Depth of Binary TreeLeetCode
- Leetcode-Balanced Binary TreeLeetCode
- Balanced Binary Tree leetcode javaLeetCodeJava
- Leetcode-Unique Binary Search TreesLeetCode