• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

关于java:LeetCode099恢复二叉搜索树

java 搞代码 3年前 (2022-01-27) 39次浏览 已收录 0个评论

复原二叉搜寻树

题目形容:给你二叉搜寻树的根节点 root ,该树中的两个节点被谬误地替换。请在不扭转其构造的状况下,复原这棵树。

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

示例阐明请见LeetCode官网。

起源:力扣(LeetCode)
链接:https://leetcode-cn.com/probl…
著作权归领扣网络所有。商业转载请分割官网受权,非商业转载请注明出处。

解法一:递归法
  • 首先,通过中序遍历失去二叉搜寻树的所有节点allNodes,失常状况下,如果没有节点被谬误的替换,allNodes所有节点应该是按升序排列,所以要找出被替换的2个节点;
  • 从后往前遍历allNodes,找到第一个值比后面的值小的节点,即为谬误的第一个节点high;
  • high-1开始往前遍历allNodes,找到第一个值比high节点小的节点low,low+1地位的节点即为谬误的第二个节点;
  • 替换low和high2个节点的值,即可复原这棵树。
<code class="java">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();
    }
}

【每日寄语】 感激不离不弃的你,让我晓得仍有人爱我。感激你的反对,不管明天有多挫折,我仍会怯懦地活下去。


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:关于java:LeetCode099恢复二叉搜索树
喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址