美文网首页
二叉树恢复

二叉树恢复

作者: ButICare_b72d | 来源:发表于2023-02-15 23:04 被阅读0次

今天刷了一些java基础相关的知识,类加载、线程并发,静态属性与成员加载时机等相关题目,未成体系,刷一道LeetCode作为今天的打卡

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

题解:

package src;

import java.util.ArrayList;

import java.util.List;

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

class Solution {

    public static void main(String[] args) {

//        TreeNode root = new TreeNode(1);

//        root.left = new TreeNode(3);

//        root.left.right = new TreeNode(2);

        TreeNode root = new TreeNode(3);

        root.left = new TreeNode(1);

        root.right = new TreeNode(4);

        root.right.left = new TreeNode(2);

        Solution solution = new Solution();

        List<TreeNode> treeNodes = solution.recoverTree(root);

        for (int i = 0; i < treeNodes.size(); i++) {

            System.out.println(treeNodes.get(i).val);

        }

    }

    public List<TreeNode> recoverTree(TreeNode root) {

        List<TreeNode> list = new ArrayList<>();

        //正常二叉搜索树中序遍历应该是依次递增的,如果两个树交换位置后就会形成两个拐点,拐点会导致数据走势突然递减,

        // 记录两次递减的坐标位置,交换坐标的值,

        // 若只有一次递减,则交换第一次递减前后node的值

        innerSearch(list, root);

        int index = 0;

        int firstIndex = -1;

        int secondIndex = -1;

        while (index < list.size() - 1) {

            if (list.get(index).val <= list.get(index + 1).val) {

                index++;

                continue;

            }

            if (firstIndex == -1) {

                firstIndex = index++;

                continue;

            }

            secondIndex = index + 1;

            break;

        }

        if (secondIndex == -1) {

            secondIndex = firstIndex + 1;

        }

        int temp = list.get(firstIndex).val;

        list.get(firstIndex).val = list.get(secondIndex).val;

        list.get(secondIndex).val = temp;

        return list;

    }

    private void innerSearch(List<TreeNode> list, TreeNode root) {

        if (root == null) {

            return;

        }

        innerSearch(list, root.left);

        list.add(root);

        innerSearch(list, root.right);

    }

    private static class TreeNode {

        int val;

        TreeNode left;

        TreeNode right;

        TreeNode() {

        }

        TreeNode(int val) {

            this.val = val;

        }

        TreeNode(int val, TreeNode left, TreeNode right) {

            this.val = val;

            this.left = left;

            this.right = right;

        }

    }

}

//还可以继续优化一下,在中序遍历的时候就比较记录下Node了,情人节,陪老婆去了

————————————————

版权声明:本文为CSDN博主「张野1994」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/qq_24679971/article/details/129035299

相关文章

  • PAT 甲级 刷题日记|A 1123 Is It a Compl

    单词 complete binary tree 完全二叉树 restore 修复 恢复 题目 An AVL tre...

  • 数据结构与算法-二叉树02

    二叉树的定义 二叉树的特点 二叉树的五中基本形态 其他二叉树 斜二叉树 满二叉树 完全二叉树图片.png满二叉树一...

  • 由遍历序列恢复二叉树

    根据二叉树的定义,先序遍历是先访问根节点,然后再先序遍历左子树的,最后先序遍历右子树。因此,先序遍历序列中的第一个...

  • 二叉树

    二叉树 高度 深度真二叉树 满二叉树 完全二叉树 二叉树遍历前序 中序 后序层序遍历 翻转二叉树 递归法...

  • 二叉树 基础操作

    二叉树的使用 二叉树结构 先序创建二叉树 DFS 先序遍历二叉树 中序遍历二叉树 后序遍历二叉树 BFS 层次遍历...

  • 树与二叉树

    **树 ** 二叉树 满二叉树 完全二叉树 三种遍历方法 树与二叉树的区别 二叉查找树 平衡二叉树 红黑二叉树

  • 二叉树的宽度优先搜索(层次遍历,BFS)

    二叉树结构: 二叉树宽度优先搜索: 按照二叉树的层数依次从左到右访问二叉树的节点;例如:给定一个二叉树: 按照宽度...

  • 剑指 offer:39、平衡二叉树

    39. 平衡二叉树 题目描述 输入一棵二叉树,判断该二叉树是否是平衡二叉树。 解题思路: 平衡二叉树:Wiki:在...

  • Algorithm小白入门 -- 二叉树

    二叉树二叉树构造二叉树寻找重复子树 1. 二叉树 基本二叉树节点如下: 很多经典算法,比如回溯、动态规划、分治算法...

  • 14-树&二叉树&真二叉树&满二叉树

    一、树 二、二叉树 三、真二叉树 四、满二叉树

网友评论

      本文标题:二叉树恢复

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