Recover
Binary Search TreeSep
1 '12
Two elements of a binary search tree (BST) are swapped by mistake.
Recover the tree without changing its structure.
first try is not working. When encounter a problem and feel very complicated. try to divide it to different sub-problems. not as complicated as you think at first.
java:
/**
* 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) {
TreeNode node = root;
Stack<TreeNode> stack = new Stack<TreeNode>();
List<TreeNode> list = new ArrayList<TreeNode>();
TreeNode pre = null;
while(node!=null || !stack.isEmpty()) {
if(node==null) {
node = stack.pop();
if( pre != null && pre.val > node.val) {
list.add(pre);
list.add(node);
}
pre = node;
node = node.right;
} else {
stack.push(node);
node = node.left;
}
}
if(list.size() == 2) {
int temp = list.get(0).val;
list.get(0).val = list.get(1).val;
list.get(1).val = temp;
}
if(list.size() == 4 ) {
int temp = list.get(0).val;
list.get(0).val = list.get(3).val;
list.get(3).val = temp;
}
}
}
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
void recoverTree(TreeNode *root) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
//15342
if(!root) return;
stack<TreeNode*> mystack;
TreeNode* n = root;
int flag = 0;
TreeNode * pre = new TreeNode(INT_MIN);
TreeNode * first = NULL;
TreeNode * second = NULL;
TreeNode * third = NULL;
TreeNode * fourth = NULL;
while(!mystack.empty() || n) {
if(!n){
n = mystack.top();
mystack.pop();
if(n->val < pre->val) {
if(flag==0) {
first = pre;
second = n;
++flag;
} else {
third = pre;
fourth = n;
++flag;
break;
}
}
pre = n;
n = n->right;
} else {
mystack.push(n);
n = n->left;
}
}
if(flag==1) {
int temp = first->val;
first->val = second->val;
second->val = temp;
} else if(flag==2) {
int temp = first->val;
first->val = fourth->val;
fourth->val = temp;
}
}
};
本文解决了一个二叉搜索树中两个元素位置错误交换的问题,通过遍历和比较节点值,找出并修正了错误的位置。使用了Java和C++实现了解决方案。

1574

被折叠的 条评论
为什么被折叠?



