美文网首页
LeetCode-099-恢复二叉搜索树

LeetCode-099-恢复二叉搜索树

作者: 醉舞经阁半卷书 | 来源:发表于2021-11-12 09:55 被阅读0次

恢复二叉搜索树

题目描述:给你二叉搜索树的根节点 root ,该树中的两个节点被错误地交换。请在不改变其结构的情况下,恢复这棵树。

进阶:使用 O(n) 空间复杂度的解法很容易实现。你能想出一个只使用常数空间的解决方案吗?

示例说明请见LeetCode官网。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/recover-binary-search-tree/
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解法一:递归法
  • 首先,通过中序遍历得到二叉搜索树的所有节点allNodes,正常情况下,如果没有节点被错误的交换,allNodes所有节点应该是按升序排列,所以要找出被交换的2个节点;
  • 从后往前遍历allNodes,找到第一个值比前面的值小的节点,即为错误的第一个节点high;
  • high-1开始往前遍历allNodes,找到第一个值比high节点小的节点low,low+1位置的节点即为错误的第二个节点;
  • 交换low和high2个节点的值,即可恢复这棵树。
import java.util.ArrayList;
import java.util.List;

public class LeetCode_099 {
    public static void recoverTree(TreeNode root) {
        List<TreeNode> allNodes = inOrder(root);
        int high = -1, low = -1;
        for (int i = allNodes.size() - 1; i >= 1; i--) {
            // 找到上面的要交换的节点
            if (allNodes.get(i).val < allNodes.get(i - 1).val) {
                high = i;
                break;
            }

        }

        // 找到下面要交换的节点
        for (low = high - 1; low >= 0; low--) {
            if (allNodes.get(low).val < allNodes.get(high).val) {
                break;
            }
        }
        low++;
        int temp = allNodes.get(low).val;
        allNodes.get(low).val = allNodes.get(high).val;
        allNodes.get(high).val = temp;
    }

    /**
     * 中序遍历
     *
     * @param root
     * @return
     */
    private static List<TreeNode> inOrder(TreeNode root) {
        List<TreeNode> nodes = new ArrayList<>();
        if (root != null) {
            nodes.addAll(inOrder(root.left));
            nodes.add(root);
            nodes.addAll(inOrder(root.right));
        }
        return nodes;
    }

    public static void main(String[] args) {
        TreeNode root = new TreeNode(3);
        root.left = new TreeNode(1);
        root.right = new TreeNode(4);
        root.right.left = new TreeNode(2);

        recoverTree(root);
        System.out.println("恢复之前");
        root.print();
        System.out.println();
        System.out.println("恢复之后");
        root.print();
    }
}

【每日寄语】 感谢不离不弃的你,让我知道仍有人爱我。感谢你的支持,不论今天有多挫折,我仍会勇敢地活下去。

相关文章

  • LeetCode-099-恢复二叉搜索树

    恢复二叉搜索树 题目描述:给你二叉搜索树的根节点 root ,该树中的两个节点被错误地交换。请在不改变其结构的情况...

  • 数据结构与算法之二叉搜索树(八)

    目录 二叉搜索树概念二叉搜索树的接口设计,包括增,删,改,查平衡二叉搜索树 一 二叉搜索树 二叉搜索树是二叉树的一...

  • 递归-深度优先遍历-99. 恢复二叉搜索树

    Leetcode 恢复二叉搜索树 分析:首先题目寿命恰好存在两个错误节点;因为二叉搜索树的中序遍历一定是有序的,那...

  • Algorithm小白入门 -- 二叉搜索树

    二叉搜索树二叉搜索树 BSTBST 的基本操作计算合法的 BST 1. 二叉搜索树 BST 二叉搜索树(Binar...

  • 99. 恢复二叉搜索树

    二叉搜索树中的两个节点被错误地交换。 请在不改变其结构的情况下,恢复这棵树。 思路: 首先,要知道二叉搜索树的中序...

  • 二叉搜索树

    二叉搜索树 图解二叉树搜索算法图解:二叉搜索树算法二叉查找树(Binary Search Tree),(又:二叉搜...

  • 99. 恢复二叉搜索树

    99. 恢复二叉搜索树[https://leetcode.cn/problems/recover-binary-s...

  • 23-红黑树

    1.二叉搜索树(BST)继承二叉树(BinaryTree) 2.平衡二叉搜索树(BBST)继承二叉搜索树(BST)...

  • 二叉搜索树(Binary Search Tree)

    1. 定义 二叉搜索树(BST)又叫二叉查找树,二叉排序树。二叉搜索树就是一棵二叉树,但是它又具有搜索树的特征: ...

  • 二叉树基础

    二叉树的分类 完全二叉树与满二叉树 二叉搜索树BST 平衡二叉搜索树BBST因为二叉搜索树有可能退化为链表,降低查...

网友评论

      本文标题:LeetCode-099-恢复二叉搜索树

      本文链接:https://www.haomeiwen.com/subject/vtinzltx.html