美文网首页
【leetcode】No.99:recover-binary-s

【leetcode】No.99:recover-binary-s

作者: I讨厌鬼I | 来源:发表于2019-08-26 21:39 被阅读0次

二叉搜索树中的两个节点被错误地交换。

请在不改变其结构的情况下,恢复这棵树。

示例 1:

输入: [1,3,null,null,2]

   1
  /
 3
  \
   2

输出: 

[3,1,null,null,2]

   3
  /
 1
  \
   2

示例 2:

输入: [3,1,4,null,null,2]

  3
 / \
1   4
   /
  2

输出: [2,1,4,null,null,3]

  2
 / \
1   4
   /
  3

进阶:
使用 O(n) 空间复杂度的解法很容易实现。
你能想出一个只使用常数空间的解决方案吗?

思路:

不考虑常数空间复杂度则使用中序遍历就好,如果要用常数空间复杂度则需要使用二叉线索树,树的右指针指向下一个节点,首先从根节点往前构建线索,然后在顺着线索往后遍历进行判断,具体看代码。

代码:

/**
 * Definition for binary tree
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {

    TreeNode first,second;

    public void recoverTree(TreeNode root) {
        TreeNode cur = root, pre = null;
        while (cur != null){
            // 如果该子树根节点没有左子树,则不需要构建线索
            if (cur.left == null){
                detect(pre, cur);
                pre = cur;
                cur = cur.right;
            }
            else {
                // 左指针节点比根节点小,构建线索要往前,所以当根节点线索完成后需要创建左指针节点的线索
                TreeNode node = cur.left;
                // 找到左指针节点的最右节点,这是根节点的前一个节点
                while (node.right != null && node.right != cur) node = node.right;
                // 创建线索
                if (node.right == null){
                    node.right = cur;
                    cur = cur.left;
                }
                // 如果线索已经存在,需要进行二叉搜索树判断,并把线索去掉
                else {
                    detect(pre, cur);
                    pre = cur;
                    cur = cur.right;
                    // 去掉线索
                    node.right = null;
                }
            }
        }
        //交换错误的两个节点的值
        if (first != null && second != null) {
            first.val = first.val + second.val;
            second.val = first.val - second.val;
            first.val -= second.val;
        }
    }

    // 监测是否符合二叉搜索树
    private void detect(TreeNode pre, TreeNode cur){
        if (pre != null && pre.val > cur.val){
            if (first == null) first = pre;
            second = cur;
        }
    }
}

相关文章

  • 【leetcode】No.99:recover-binary-s

    二叉搜索树中的两个节点被错误地交换。 请在不改变其结构的情况下,恢复这棵树。 示例 1: 示例 2: 进阶:使用 ...

  • No.99

    今天是中秋,No.99,也是遗憾这个中秋不能与你同在。 不过明天是百日纪念日来着,也是你归来的日子,胜过盼星星盼月...

  • 『No.99』

    属于你们的假期即将开启。 作为妈妈的我,心情也跟着激动起来。 毕竟和好朋友一起出行还是第一次。 你们即将要在一起吃...

  • 0802 No.99

    原句:至于所有的花,已交给蝴蝶去数。所有的蕊交给蜜蜂去编册。所有的树,交给风去纵宠。而风,交给檐前的老风铃去一一记...

  • 孩子出不出色,与母亲的性格颇有关系!

    365日更NO.99 最近跟孩子亲子阅读《名人传记》,发现里面是这样描写母亲的: 母亲温柔、贤淑、...

  • NO.99旁收博采

    人生本来如梦,梦又套着人生,究竟孰真孰假,难以评断。只管去梦,不必给自己添一道鉴别的程序。梦见和爱人一起去吃饭,好...

  • No.99 划船比赛

    一个乌云密布的上午,下了一场大雨,陆地上的水渐渐上升,小蚂蚁们都快要淹死了,它们急得团团转。小蚂蚁们不知不觉在水上...

  • No.99《正向力》

    核心书摘 《正向力》是一本增强个人自信心,激发团队潜能的书。面对一份工作,有的人有足够的能力却不敢上手;有的团队十...

  • 豆瓣8.8 鬼才导演的《大鱼》适合所有想了解自己父亲的人

    豆瓣打分8.8,Top榜No.99,“鬼才导演”蒂姆伯顿,奇幻与亲情交叉,这些标签无一不标志了《大鱼》是一部好片子...

  • 《少即是多》No.99

    估计之前有在微信读书上订阅《少即是多》这本书,所以这本书上架的时候,收到了通知。 忘记是从哪里知道这本书,估计应该...

网友评论

      本文标题:【leetcode】No.99:recover-binary-s

      本文链接:https://www.haomeiwen.com/subject/racjectx.html