[LeetCode] 一个BST的两个节点的值被交换,要求修正这个BST
来源:互联网 发布:改键位软件 编辑:程序博客网 时间:2024/05/21 15:43
给你一个搜索二叉树,如下:
6
/ \
10 2
/ \ / \
1 3 7 12
可以看到 10 和 2 的位置发生了交换。要求设计算法,回复原来的BST。
算法一:http://www.geeksforgeeks.org/fix-two-swapped-nodes-of-bst/
算法二:下面的算法是一个流传很广的算法,但是其实是错误的。首先给出算法,然后给出failure case。
算法二思路:可以借助 isValidBST 的思想,找出被交换的两个节点 。找到之后,把他们交换回去就可以了。
代码如下:
#include <stdio.h>#include <stdlib.h>#define INT_MIN -100#define INT_MAX 100 struct Node{ int key; Node* left; Node* right; Node(int k, Node* l, Node* r): key(k), left(l), right(r){};};void correct_helper(Node* root, Node** p1, Node** p2, int min, int max) {if(root==NULL) return;else if(root->key < max && root->key > min) {correct_helper(root->left, p1, p2, min, root->key);correct_helper(root->right, p1, p2, root->key, max);}else {if(*p1){ *p2 = root; return; }// return after the second invalid node foundelse *p1 = root;}}void correct(Node* root) {Node** p1 = new Node*(NULL);Node** p2 = new Node*(NULL);correct_helper(root, p1, p2, -100, 100);int temp = (*p1)->key;(*p1)->key = (*p2)->key;(*p2)->key = temp;}int main(){Node* n1 = new Node(1, NULL, NULL);Node* n3 = new Node(3, NULL, NULL);Node* n7 = new Node(7, NULL, NULL);Node* n12 = new Node(12, NULL, NULL);Node* n10 = new Node(10, n1, n3);Node* n2 = new Node(2, n7, n12);Node* n6 = new Node(6, n10, n2);correct(n6);}算法二成功的条件是,被交换到两个节点分别位于一个祖先节点的左右子树中。
如果被交换的两个节点的其中一个是另外一个的祖先,算法二就失败了。
下面的二叉树就是个例子:
3
/
4
/
5
上面的二叉树中,3和5被交换。算法二会失败。
3
/
4
/
5
上面的二叉树中,3和5被交换。算法二会失败。
- [LeetCode] 一个BST的两个节点的值被交换,要求修正这个BST
- 每天一道LeetCode-----二叉搜索树的某两个节点被交换位置,修正这个二叉搜索树
- BST的一个实现
- Recover Binary Search Tree BST找乱序的两个元素 @LeetCode
- 【BST】找出有重复值的BST中值为key的第一个节点
- 二叉搜索树(BST)的两个元素被错误地交换。 恢复树,而不改变它的结构。
- leetcode交换相邻的两个节点的值
- 【二叉树】寻找二叉树/BST的两个节点的最低公共祖先
- 在一个二叉排序树(BST)(left<right)中查找某个节点的后序节点
- 数据结构与算法[LeetCode]—找出N个节点的BST的所有形态组合
- 找出BST上任意节点的下一个节点
- BST的操作
- BST树的查找
- BST树的删除
- Treap的动态平衡BST
- BST的后续遍历
- BST树的实现
- 生成所有的BST
- Objective C的学习之HelloWorld
- 【学习笔记】python版选择排序和插入排序及时间复杂度分析
- POJ2151--Check the difficulty of problems
- Android JNI入门实例(Windows+Cygwin+Eclipse)
- property()
- [LeetCode] 一个BST的两个节点的值被交换,要求修正这个BST
- linux上ln命令详细说明
- 使用TreeSet集合比较Comparable接口和Comparator接口的区别
- 内存Dump原理
- 漫谈大数据仓库与挖掘系统(一):前言:大数据的价值
- 漫谈大数据仓库与挖掘系统(二):层次、维度与主题
- 漫谈大数据仓库与挖掘系统(三):ETL的开始——数据的传输和同步
- 正则表达式
- VIM的几个使用技巧