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

相关文章

HTML5 搜索框Search Box详解

《HTML5搜索框SearchBox详解》HTML5的搜索框是一个强大的工具,能够有效提升用户体验,通过结合自动补全功能和适当的样式,可以创建出既美观又实用的搜索界面,这篇文章给大家介绍HTML5... html5 搜索框(Search Box)详解搜索框是一个用于输入查询内容的控件,通常用于网站或应用程

基于Python实现一个Windows Tree命令工具

《基于Python实现一个WindowsTree命令工具》今天想要在Windows平台的CMD命令终端窗口中使用像Linux下的tree命令,打印一下目录结构层级树,然而还真有tree命令,但是发现... 目录引言实现代码使用说明可用选项示例用法功能特点添加到环境变量方法一:创建批处理文件并添加到PATH1

Go语言中Recover机制的使用

《Go语言中Recover机制的使用》Go语言的recover机制通过defer函数捕获panic,实现异常恢复与程序稳定性,具有一定的参考价值,感兴趣的可以了解一下... 目录引言Recover 的基本概念基本代码示例简单的 Recover 示例嵌套函数中的 Recover项目场景中的应用Web 服务器中

哈希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,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点