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

    1、题目描述:

    https://leetcode-cn.com/problems/recover-binary-search-tree/

    2、思路:

    // 先中序遍历二叉搜索树树,遍历结果的元素应该单调递增
    // 然后找出错误位置的节点
    // 交换连个错误节点的值

    3、代码:

    package 二叉树;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class 恢复二叉搜索树 {
        public static void main(String[] args) {
            TreeNode t1 = new TreeNode(1);
            TreeNode t2 = new TreeNode(3);
            TreeNode t3 = new TreeNode(2);
            t1.left=t2;
            t2.right=t3;
            恢复二叉搜索树 a = new 恢复二叉搜索树();
            a.recoverTree(t1);
        }
    
        // 先中序遍历二叉搜索树树,遍历结果的元素应该单调递增
        // 然后找出错误位置的节点
        // 交换连个错误节点的值
        public void recoverTree(TreeNode root) {
            ArrayList<Integer> travalResult = new ArrayList<>();
            transTree(root, travalResult);
            int[] missTreeNode = getMissTreeNode(travalResult);
            reBuildTree(root, missTreeNode);
        }
    
        // 二叉搜索树的中序遍历结果递增
        public void transTree(TreeNode root, List<Integer> travalResult) {
            if (root == null) {
                return;
            }
            transTree(root.left,travalResult);
            travalResult.add(root.val);
            transTree(root.right,travalResult);
        }
    
        // 2、8、6、7、4、9
        // 2、4、6、7、9
        // 获取错误的两个节点,前一个元素大于后一个元素
        // 第一个前一个元素大于后一个元素的两个数的第一个数是错误元素
        // 第二个前一个元素大于后一个元素的两个数的第二个数是错误元素
        // 考虑特殊情况,两个错误元素是相邻的
        public int[] getMissTreeNode(List<Integer> travalResult) {
            int[] result = new int[2];
            for (int i = 0; i < travalResult.size() - 1; i++) {
                if (travalResult.get(i) > travalResult.get(i + 1)) {
                    if(result[0]==0){
                        result[0]=travalResult.get(i);
                        result[1]=travalResult.get(i+1);
                    }else {
                        result[1]=travalResult.get(i+1);
                    }
                }
            }
            return result;
        }
    
        // 交换二叉树中的两个节点的值
        public void reBuildTree(TreeNode root, int[] missTreeNode) {
            if (root == null) {
                return;
            }
            if (root.val == missTreeNode[0]) {
                root.val = missTreeNode[1];
            }else if(root.val == missTreeNode[1]){
                root.val = missTreeNode[0];
            }
            reBuildTree(root.left, missTreeNode);
            reBuildTree(root.right, missTreeNode);
        }
    
        public static class TreeNode {
            public int val;
            TreeNode left;
            TreeNode right;
    
            public TreeNode(int val) {
                this.val = val;
            }
    
        }
    }

    。。

  • 相关阅读:
    JqueryValidate表单相同Name不校验问题解决
    钉钉SDK使用。
    禁用software reporter tool.exe 解决CPU高占用率的问题
    一个小巧,也很nice的“小日历”--一个Android App
    Android模拟器太慢怎么办?使用微软的VS模拟器
    windows10下录屏
    启明星会议室预订系统(企业微信)版发布
    JS图片压缩
    JS操作摄像头
    钉钉版会议室预订系统使用指南
  • 原文地址:https://www.cnblogs.com/guoyu1/p/15321041.html
Copyright © 2011-2022 走看看