zoukankan      html  css  js  c++  java
  • LeetCode-099-恢复二叉搜索树

    恢复二叉搜索树

    题目描述:给你二叉搜索树的根节点 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();
        }
    }
    

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

  • 相关阅读:
    linux usb 驱动详解
    md5sum.c, md5.c, md5.h
    安装 Kali Linux 后需要做的 20 件事
    Readprocessmemory使用方法
    在Centos下安装matlab
    PE文件简单介绍
    MATLAB中导入数据:importdata函数
    数据交换工具Kettle
    编写你自己的单点登录(SSO)服务
    AVL树
  • 原文地址:https://www.cnblogs.com/kaesar/p/15543137.html
Copyright © 2011-2022 走看看