[LeetCode]Recover Binary Search Tree

本文介绍了一种通过中序遍历找出并交换二叉搜索树中两个被错误放置节点的方法,利用Java语言特性实现。文章还探讨了Java传参机制,并提供了完整的代码示例。

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

一题一句:
BST 的内在性质,inorder traversal 里遵循的左小右大关系是突破口,俩个node错位最多只会导致出现俩次左大右小,只需交换第一次的前一个和第二次的后一个,若只有一次错位,则很简单。

经典题目补充:简而言之,java 传参传入的是指针,一担指针地址在方程内被改写,指针便与原来的地址失去关联。

这个题目有一点很有启发性,尤其对于java语言的新手。prev传参数是用一个arrayList(尽管只有一个node),如果把prev 当成ListNode 传入,是不对的。Java的传参,传的是指针的值。所以你可以认为是传reference ,也可以认为传copy。因为它传的是reference的copy(本质上异与value的copy)。所以一但你把这个reference 指向了别的obj,从此这个变量名就与起初它指向的值失去了关联。 他开始指向新的obj了。 简而言之,传入了指针,一担指针地址被改写,指针便不再指向原来的地址。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    public void recoverTree(TreeNode root) {
        if(root == null){
            return ;
        }
        ArrayList
  
    res = new ArrayList
   
    ();
        ArrayList
    
      prev = new ArrayList
     
      ();
        prev.add(null);
        helper(root,prev,res);
        if(res.size() > 0){
            int temp = res.get(0).val;
            res.get(0).val = res.get(1).val;
            res.get(1).val = temp;
        }
        
    }
    
    public void helper(TreeNode root,ArrayList
      
        prev, ArrayList
       
         res){ if(root == null){ return; } helper(root.left,prev,res); if(prev.get(0) != null && prev.get(0).val > root.val){ if(res.size() == 0){ res.add(prev.get(0)); res.add(root); }else{ res.set(1,root); } } prev.set(0,root); helper(root.right,prev,res); } }
       
      
     
    
   
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值