zoukankan      html  css  js  c++  java
  • 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) space is pretty straight forward. Could you devise a constant space solution?


    constant space resolution: Morris Traversal or Morris Threading Traversal.

    也是用中序遍历的思想,找那个元素不是递增。Morris traversal用threaded binary tree进行中序遍历,只要O(1)的空间复杂度。

    /**
     * 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) {
            TreeNode cur = root, prev = null, n1 = null, n2 = null, last = null;
            while (cur != null) {
                prev = cur.left;
                if (prev == null) { // visit current node
                    if (last != null && cur.val < last.val) {
                        if (n1 == null) {
                            n1 = last;
                            n2 = cur;
                        } else {
                            n2 = cur;
                        }
                    }
                    last = cur;
                    cur = cur.right; // jump to its next
                    continue;
                }
                while (true) {
                    if (prev.right == null) {
                        prev.right = cur;
                        cur = cur.left;
                        break;
                    } else if (prev.right == cur) { // visit current node
                        prev.right = null;
                        if (cur.val < last.val) {
                            if (n1 == null) {
                                n1 = last;
                                n2 = cur;
                            } else {
                                n2 = cur;
                            }
                        }
                        last = cur;
                        cur = cur.right;
                        break;
                    }
                    prev = prev.right;
                }
            }
            int tmp = n1.val;
            n1.val = n2.val;
            n2.val = tmp;
        }
    }
    

    只会straight forward的O(n)解法:BST的中序遍历应该是递增的,对给的树中序遍历,如果碰到递减的元素,记下来,说明是被交换过的。

    /**
     * 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) {
            Stack<TreeNode> stack = new Stack<TreeNode>();
            TreeNode n1 = null, n2 = null, n3 = null, cur = root, prev = null, tmp = null;
            while (cur != null) {
                stack.push(cur);
                cur = cur.left;
            }
            while (!stack.empty()) {
                cur = stack.pop();
                if (prev != null && cur.val < prev.val) {
                    if (n1 == null) {
                        n1 = prev;
                        n2 = cur;
                    } else {
                        n2 = cur;
                        break;
                    }
                }
                prev = cur;
                tmp = cur.right;
                while (tmp != null) {
                    stack.push(tmp);
                    tmp = tmp.left;
                }
            }
            // should find the parent of n1 and n2 instead of swapping values?
            int v1 = n1.val;
            n1.val = n2.val;
            n2.val = v1;
        }
    }
    
  • 相关阅读:
    使用babel插件集
    使用babel
    webpack基本配置
    vue-router参数传递
    路由(二) router-link的使用
    路由使用(一)
    获取DOM
    父组件传递值给子组件(一)
    定义全局组件
    Windows下更改MySQL数据库的存储位置
  • 原文地址:https://www.cnblogs.com/yuchenkit/p/7192284.html
Copyright © 2011-2022 走看看