二叉搜索树中有两个位置错位了,需要重新修正

本文介绍了一种在不改变二叉搜索树结构的情况下,恢复因两个元素错误交换导致的问题的方法。通过中序遍历,利用递归技术找到并交换错误节点,实现常数空间复杂度的解决方案。

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

Two elements of a binary search tree (BST) are swapped by mistake.

Recover the tree without changing its structure.

Note:
A solution using O(n ) space is pretty straight forward. Could you devise a constant space solution?

confused what"{1,#,2,3}"means?

package niuke.day1;

public class Recover_Binary_search_tree1 {
    TreeNode pre,p,q;        //设三个树节点为全局变量
     public static void main(String[] args) {
        
    }
     public void recoverTree(TreeNode root) {
        p = q = pre = null;    //对全局变量进行初始化
        dfs(root);             //调用dfs()函数,似的p,q分别指向两个位置错误的位置
        int temp = p.val;      //把p,q的值互相交换,就会达到目的
        p.val = q.val;
        q.val = temp;
    }
     //若想到了中须遍历二叉搜索树,相当于一个递增的数列,换了两个位置,换位置位置发现不同,会对编程有大大的帮助
    private void dfs(TreeNode root) {    
        //递归调用,先左子树,再根节点,再右子树,实现了整个二叉搜索树的按数值从小到大的遍历
        // TODO Auto-generated method stub
        if(root == null)       //若遇到空节点则返回跳过,我感觉对于二叉树的递归都有这个,得记住了。
            return;
        dfs(root.left);        
        if(pre != null && pre.val > root.val) {  //先放pre!=null,是因为怕出现空节点异常
            if(p == null) {      //若此时没有找到出错的第一个节点,则把pre当成第一个为p,
                /*把root当成q,若之后没有再进入判断,没有找到第二个出错的,则第二个出错的就为root*/
                p = pre;
                q = root;
            }else {             //若出现了第二个出错的,则把第二个节点录入为q
                q = root;
            }
        }
        pre = root;             //然后把root传递给pre,保证了pre是中序遍历中root的前一个元素,则好进行下一个对比
        dfs(root.right);
    }
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值