关闭

Recover Binary Search Tree

标签: javaleetcodetreebinary search trees
127人阅读 评论(0) 收藏 举报
分类:

题目描述:

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?


最简单的办法,中序遍历二叉树生成序列,然后对序列中排序错误的进行调整。最后再进行一次赋值操作。但这种方法要求n的空间复杂度

递归中序遍历二叉树,设置一个pre指针,记录当前节点中序遍历时的前节点,如果当前节点大于pre节点的值,说明需要调整次序。
有一个技巧是如果遍历整个序列过程中只出现了一次次序错误,说明就是这两个相邻节点需要被交换。如果出现了两次次序错误,那就需要交换这两个节点。

跟二叉搜索树相关的内容都可以先考虑一下中序遍历。

代码如下:

public class Solution {
    TreeNode mistake1, mistake2;;  
    TreeNode pre;  
      
    void recursive_traversal(TreeNode root) {  
        if(root==null) {  
            return;  
        }  
        if(root.left!=null) {  
            recursive_traversal(root.left);  
        }  
        if(pre!=null&&root.val<pre.val) {  
            if(mistake1==null) {
                mistake1 = pre;  
                mistake2 = root;  
            } else {  
                mistake2 = root;  
            }  
        }   
        //得到下一个root的pre节点
        pre = root;  
        if(root.right!=null) {  
            recursive_traversal(root.right);  
        }  
    }  
    public void recoverTree(TreeNode root) {  
        //pre必须设为null,通过遍历的时候设进去。因为是中序遍历,所以pre应该是深层叶子左子树的父节点。  
        recursive_traversal(root);  
        if(mistake1!=null&&mistake2!=null) {  
            int tmp = mistake1.val;  
            mistake1.val = mistake2.val;  
            mistake2.val = tmp;  
        }  
    }  
}



0
0
查看评论

Recover Binary Search Tree -- LeetCode

原题链接: http://oj.leetcode.com/problems/recover-binary-search-tree/  这道题是要求恢复一颗有两个元素调换错了的二叉查找树。一开始拿到可能会觉得比较复杂,其实观察出规律了就比较简单。主要还是利用二叉查找树的主要性质,...
  • linhuanmars
  • linhuanmars
  • 2014-04-27 03:09
  • 15288

LeetCode 99:Recover Binary Search Tree

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) ...
  • geekmanong
  • geekmanong
  • 2015-12-28 15:37
  • 2073

【LeetCode】Recover Binary Search Tree 解题报告

【题目】 Two elements of a binary search tree (BST) are swapped by mistake. Recover the tree without changing its structure. Note: A solution us...
  • ljiabin
  • ljiabin
  • 2015-03-21 11:58
  • 2145

LeetCode99—Recover Binary Search Tree

LeetCode99—Recover Binary Search Tree 恢复排序二叉树
  • zhangxiao93
  • zhangxiao93
  • 2016-03-19 22:12
  • 618

LeetCode(99)Recover Binary Search Tree

题目如下: 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...
  • feliciafay
  • feliciafay
  • 2014-01-17 14:23
  • 967

二叉搜索树(Binary Search Tree )的定义及分析

定义:     二叉搜索树或者是一棵空树,或者是具有下列性质的二叉树: 每个结点都有一个作为搜索依据的关键码(key),所有结点的关键码互不相同。 左子树(如果非空)上所有结点的关键码都小于根结点的关键码。 右子树(如果非空)上所有...
  • jsh13417
  • jsh13417
  • 2013-01-22 21:59
  • 3440

Recover Binary Search Tree(恢复二叉搜索树)

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) spac...
  • cow__sky
  • cow__sky
  • 2014-03-07 21:42
  • 1603

数据结构-BST(Binary Search Tree)

/****************************************** 数据结构: BST(Binary Search Tree),二叉查找树; 性质: 若结点的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若结点的右子树不空,则右子树上所有结点的值均大于它的根结点的值...
  • Jarily
  • Jarily
  • 2013-03-15 19:00
  • 7135

二叉搜索树(Binary Search Tree)的插入与删除

二叉搜索树的插入关键是要找到元素应该插入的位置,可以采用与Find类似的方法。 二叉搜索树的删除则要考虑三种情况:   1.要删除的是叶节点:直接删除,并再修改其父节点指针置为NULL   2.要删除的节点只有一个孩子的节点:将其父节点的指针指向要删除节点的孩子节点...
  • song_hui_xiang
  • song_hui_xiang
  • 2015-08-16 13:10
  • 1018

二叉搜索树的查询、插入与删除操作(Binary Search Tree, Search, Insert, Delete)(C++)

一、概念     设 x 是二叉搜索树中的一个结点。如果 y 是 x 左子树中的一个结点,那么 y.key ≦ x.key。如果 y 是 x 右子树中的一个结点,那么 y.key ≧ x.key。     为了便于描述,我们按如下方式定...
  • zhangpiu
  • zhangpiu
  • 2015-11-19 16:09
  • 1142
    个人资料
    • 访问:64224次
    • 积分:2777
    • 等级:
    • 排名:第15304名
    • 原创:215篇
    • 转载:37篇
    • 译文:0篇
    • 评论:6条
    最新评论