leetcode: Recover Binary Search Tree

本文介绍如何通过中序遍历来定位并修复二分查找树中的节点位置错误,详细解析了两种出错情况及相应的修复策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目的意思是二分查找树中有两个点的位置出现错误,找到并调整过来。  对于BST,很重要的特征就是中序遍历是从小到大排列的。  那么中序遍历一遍BST,找到小于前一节点的节点即为出错的位置。

但是有两种可能的出错方式:

1. 左子结点大于根节点小于右子结点或根节点大于右子结点大于左子结点。  这种情况下找到的当前节点和前一节点就是出错的两个节点

2. 左子结点大于根节点大于右子结点。这时需要交换左右子节点的位置,在中序遍历的序列中有两组点出现问题。


/**
 * Definition for binary tree
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    TreeNode pre=null,p1=null,p2=null;
    public void recoverTree(TreeNode root) {
        if( root == null )
        {
            return ;
        }
        fun( root );
        int tmp = p1.val;
        p1.val = p2.val;
        p2.val = tmp;
    }
    
    void fun( TreeNode root )
    {
        if( root == null )
        {
            return ;
        }
        fun( root.left );
        if( pre != null && pre.val > root.val )
        {
            if( p1 == null )
            {
                p1 = pre;
                p2 = root;
            }
            else
            {
                p2 = root;
            }
        }
        pre = root;
        fun( root.right );
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值