leetcode 99. Recover Binary Search Tree

3 篇文章 0 订阅
2 篇文章 0 订阅

1. 思路

中序遍历,找出其中不符合规律的节点,交换。

2. 实现

2.1 递归

  1. 当然,这样并不能符合常量空间的要求。

    class Solution {
        TreeNode first = null, second = null, pre = new TreeNode(Integer.MIN_VALUE);
        public void recoverTree(TreeNode root) {
            traverse(root);
            int temp = first.val;    //注意,这里是值,而不是节点。否则仅仅改变节点的引用,并不能真正改变节点。下同。
            first.val = second.val;
            second.val = temp;
        }
    
        public void traverse(TreeNode root){    //中序遍历,递归,找出不符合规律的两个节点。当然这样并不能满足常量空间的要求。
            if(root == null){
                return;
            }
            traverse(root.left);
            if(first==null && pre.val>=root.val){
                first = pre;    //此时,应该是前面的那个节点错了
            }
            if(first!=null && pre.val>=root.val){
                second = root;      //写个例子,自然就看出来了
            }
            pre = root;
            traverse(root.right);
        }
    }
    

2.2 Mirrors trasversal

  1. 常量空间。

    class Solution {
        public void recoverTree(TreeNode root) {
            TreeNode pre=null, node=root;
            TreeNode first=null, second=null;
            TreeNode temp=null;
            while(node!=null){
                if(node.left==null){
                    if(pre!=null && pre.val>=node.val){
                        if(first==null){
                            first = pre;
                        }
                        second = node;    //这里和上一段程序中形式上不太一样,其实流程、效果都是相同的。
                    }
                    pre = node;
                    node = node.right;
                }else{
                    temp = node.left;
                    while(temp.right!=null && temp.right!=node){
                        temp = temp.right;
                    }
                    if(temp.right == null){
                        temp.right = node;
                        node = node.left;
                    }else{
                        if(pre!=null && pre.val>=node.val){
                            if(first==null){
                                first = pre;
                            }
                            second = node;
                        }
                        pre = node;
                        temp.right = null;
                        node = node.right;
                    }
                }
            }
    
            if(first!=null && second!=null){
                int t = first.val;
                first.val = second.val;
                second.val = t;
            }
        }
    }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值