博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
99. Recover Binary Search Tree
阅读量:7200 次
发布时间:2019-06-29

本文共 3206 字,大约阅读时间需要 10 分钟。

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
stack = new Stack
(); 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; }}

 

转载于:https://www.cnblogs.com/yuchenkit/p/7192284.html

你可能感兴趣的文章