恢复二叉搜索树

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

    }
}

。。

posted @ 2021-09-22 18:01  guoyu1  阅读(51)  评论(0编辑  收藏  举报