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.
本题注意不能通过测试是否是合法二叉树来修复,而是要通过检查全局二叉树确定哪两个节点的值调换了。
检查全局二叉树就是通过检查哪两个值是不按由小到大的顺序的。
可以利用额外空间O(n)空间,也可以使用常量空间。
要点就是:利用一个数组如vector保存不合法的节点,最后恢复不合法节点。
如下面两个程序:
1 O(n)空间
void recoverTree(TreeNode *root)
{
if (!root || !root->left && !root->right) return;
vector<TreeNode *> v;
getTreeVals(v, root);
checkVals(v);
}
void getTreeVals(vector<TreeNode *> &v, TreeNode *root)
{
if (!root) return;
getTreeVals(v, root->left);
v.push_back(root);
getTreeVals(v, root->right);
}
void checkVals(vector<TreeNode *> &v)
{
int n1 = -1, n2 = -1;
//画表,根据各种情况,最后得出计算公式
for (int i = 0; i < v.size()-1; i++)
{
if (v[i]->val > v[i+1]->val)
{
if (n1 == -1) n1 = i;
else n2 = i+1;
}
}
if (n2 == -1) n2 = n1+1;
swap(v[n1]->val, v[n2]->val);
}
2 常量空间
void recoverTree(TreeNode *root)
{
if (!root || !root->left && !root->right) return;
vector<TreeNode *> v;
TreeNode *p = nullptr;
getTreeVals(v, root, p);
swap(v.front()->val, v.back()->val);
}
void getTreeVals(vector<TreeNode *> &v, TreeNode *root, TreeNode *&pre)
{
if (!root) return;
getTreeVals(v, root->left, pre);
if (pre && pre->val > root->val)
{
if (v.empty()) v.push_back(pre);
v.push_back(root);
}
pre = root;
getTreeVals(v, root->right, pre);
}
//2014-2-15 update
void recoverTree(TreeNode *root)
{
vector<TreeNode *> nodes;
TreeNode *p = NULL;
getNodes(nodes, root, p);
swap(nodes.front()->val, nodes.back()->val);
}
void getNodes(vector<TreeNode *> &nodes, TreeNode *r, TreeNode *&pre)
{
if (!r) return;
getNodes(nodes, r->left, pre);
if (pre && pre->val > r->val)
{
nodes.push_back(pre);
nodes.push_back(r);
}
pre = r;
getNodes(nodes, r->right, pre);
}
分享到:
相关推荐
LeetCode-BinarySearch
leetcode-tag-Tree
leetcode卡leetcode 二叉树卡片 LeetCode 二叉树卡片问题的章节智解
BinaryTree.py是一个方便的工具,它可以构建和显示编码时所需的二叉树 演示 您需要在使用之前导入该类 import BinaryTree as bt 从值/对象列表或二叉树构造二叉树 t1 = bt.BinaryTree([1,2,3,4,5,'#',6,7,'#','#','#...
leetcode的题目:Balanced Binary Tree
最大公共字符串leetcode 二叉树 二叉树是一种抽象的数据结构,由根节点和左右子树组成。 一个节点可以有零个、一个或两个子节点。 二叉树的类型 目标 能够熟悉二叉树上的各种术语。 能够实现二叉树节点。 能够使用...
leetcode卡除非您已经使用过卡片,否则不要看这里。 做真实的自己!
Pow(xn) leetcode Binary-Search-3 问题1 Pow(x,n) () 问题2 找到 K 个最近的元素 ()
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
Binary-Search-1 问题1 搜索二维矩阵() 问题1 在旋转排序数组中搜索 () 问题2 在无限排序数组中搜索: 给定一个未知长度的排序数组和一个要搜索的数字,返回该数字在数组中的索引。 越界访问元素会引发异常。 如果该...
leetcode110 二叉树_高度平衡 力扣110
Programming Questions on BinarySearch, LeetCode, CodeChef
704.Binary_Search二分查找【LeetCode单题讲解系列】
* [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]...
leetcode卡 LeetCode 记录一下再LeetCode上刷的题,坚持每天刷一道吧 2017.06.12 打卡[LeetCode 2. Add Two Numbers], Linked list 2017.06.13 打卡[LeetCode 200. Number of Islands], BFS 2017.06.14 打卡...
leetcode 数据结构题目中的答案,已经调试,直接运行,求二叉树的最小深度
leetcode 2 二叉树打印机 在极小的区域打印二叉树。...>binary-tree-printer</ artifactId > < version >1.0.0</ version > </ dependency > 例子 打印随机 BST。 BTPrinter . printRandom
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...
二分查找Binary_Search套路和解题模板【LeetCode刷题套路教程3】
144.Binary_Tree_Preorder_Traversal二叉树的前序遍历【LeetCode单题讲解系列】