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;
            }
    
        }
    }

    。。

  • 相关阅读:
    利用python 掌握机器学习的过程
    SendMessage用法
    python函数形参中的*args和**kwargs
    python 用win32修改注册表,修改打开IE浏览器的配置
    python .py .pyc .pyw .pyo .pyd区别
    代码性能提升10倍(ForkJoin)
    雪花算法生成id
    配置虚拟机
    kafka多线程消费
    Redis存储对象序列化和反序列化
  • 原文地址:https://www.cnblogs.com/guoyu1/p/15321041.html
Copyright © 2011-2022 走看看