LeetCode 题解(98): Recover Binary Search Tree

2024-05-28 09:18

本文主要是介绍LeetCode 题解(98): Recover Binary Search Tree,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目:

wo 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?

题解:

不用O(n) space也很简单, 如果中序遍历的话,二叉搜索树应该是递增序列,所以只要找到值减小的位置即可。C++使用了指针的指针,Java和Python使用了一个wrapper class。但其实只用定义类变量即可。切记。

c++版:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/
class Solution {
public:void recoverTree(TreeNode* root) {TreeNode* first = NULL;TreeNode* second = NULL;TreeNode* pre = NULL;traverse(root, &pre, &first, &second);int tmp = first->val;first->val = second->val;second->val = tmp;}void traverse(TreeNode* root, TreeNode** pre, TreeNode** first, TreeNode** second) {if(root->left != NULL) {traverse(root->left, pre, first, second);}if(*pre != NULL && (*pre)->val > root->val) {if(*first == NULL) {*first = *pre;*second = root;}else*second = root;*pre = root;} else {*pre = root;}if(root->right != NULL) {traverse(root->right, pre, first, second);}}
};

Java版:

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode(int x) { val = x; }* }*/
class TreeNodeWrapper {TreeNode node;TreeNodeWrapper() {node = null;}
} public class Solution {public void recoverTree(TreeNode root) {TreeNodeWrapper pre = new TreeNodeWrapper();TreeNodeWrapper first = new TreeNodeWrapper();;TreeNodeWrapper second = new TreeNodeWrapper();;traverse(root, pre, first, second);int temp = first.node.val;first.node.val = second.node.val;second.node.val = temp;}void traverse(TreeNode root, TreeNodeWrapper pre, TreeNodeWrapper first, TreeNodeWrapper second) {if(root.left != null)traverse(root.left, pre, first, second);if(pre.node != null && pre.node.val > root.val) {if(first.node == null) {first.node = pre.node;}second.node = root;}pre.node = root;if(root.right != null)traverse(root.right, pre, first, second);}
}

Python版:

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class TreeNodeWrapper:def __init__(self):self.node = Noneclass Solution:# @param {TreeNode} root# @return {void} Do not return anything, modify root in-place instead.def recoverTree(self, root):pre, first, second = TreeNodeWrapper(), TreeNodeWrapper(), TreeNodeWrapper()self.traverse(root, pre, first, second)tmp = first.node.valfirst.node.val = second.node.valsecond.node.val = tmpdef traverse(self, root, pre, first, second):if root.left != None:self.traverse(root.left, pre, first, second)if pre.node != None and pre.node.val > root.val:if first.node == None:first.node = pre.nodesecond.node = rootpre.node = rootif root.right != None:self.traverse(root.right, pre, first, second)



这篇关于LeetCode 题解(98): Recover Binary Search Tree的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1010154

相关文章

哈希leetcode-1

目录 1前言 2.例题  2.1两数之和 2.2判断是否互为字符重排 2.3存在重复元素1 2.4存在重复元素2 2.5字母异位词分组 1前言 哈希表主要是适合于快速查找某个元素(O(1)) 当我们要频繁的查找某个元素,第一哈希表O(1),第二,二分O(log n) 一般可以分为语言自带的容器哈希和用数组模拟的简易哈希。 最简单的比如数组模拟字符存储,只要开26个c

uva 575 Skew Binary(位运算)

求第一个以(2^(k+1)-1)为进制的数。 数据不大,可以直接搞。 代码: #include <stdio.h>#include <string.h>const int maxn = 100 + 5;int main(){char num[maxn];while (scanf("%s", num) == 1){if (num[0] == '0')break;int len =

AI基础 L9 Local Search II 局部搜索

Local Beam search 对于当前的所有k个状态,生成它们的所有可能后继状态。 检查生成的后继状态中是否有任何状态是解决方案。 如果所有后继状态都不是解决方案,则从所有后继状态中选择k个最佳状态。 当达到预设的迭代次数或满足某个终止条件时,算法停止。 — Choose k successors randomly, biased towards good ones — Close

leetcode-24Swap Nodes in Pairs

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode swapPairs(L

leetcode-23Merge k Sorted Lists

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode mergeKLists

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

【JavaScript】LeetCode:16-20

文章目录 16 无重复字符的最长字串17 找到字符串中所有字母异位词18 和为K的子数组19 滑动窗口最大值20 最小覆盖字串 16 无重复字符的最长字串 滑动窗口 + 哈希表这里用哈希集合Set()实现。左指针i,右指针j,从头遍历数组,若j指针指向的元素不在set中,则加入该元素,否则更新结果res,删除集合中i指针指向的元素,进入下一轮循环。 /*** @param

C - Word Ladder题解

C - Word Ladder 题解 解题思路: 先输入两个字符串S 和t 然后在S和T中寻找有多少个字符不同的个数(也就是需要变换多少次) 开始替换时: tips: 字符串下标以0开始 我们定义两个变量a和b,用于记录当前遍历到的字符 首先是判断:如果这时a已经==b了,那么就跳过,不用管; 如果a大于b的话:那么我们就让s中的第i项替换成b,接着就直接输出S就行了。 这样