题解 | # JAVA Morris Traversal二叉搜索树与双向链表# [P3]

二叉搜索树与双向链表

http://www.nowcoder.com/practice/947f6eb80d944a84850b0538bf0ec3a5

要求时间O(1), 那就只能Morris Traversal了。
Morris这个视频讲的挺清楚 https://www.youtube.com/watch?v=wGXB9OWhPTg

只需要以下变化
1. 记录第一个visited node作为ans输出
2. 记录lastVisited node, 也就是当前链表的末尾,visit(cur)时就append cur.

时间 O(1), 空间 O(n)
public class Solution {
    TreeNode lastVisited = null;
  
    public TreeNode Convert(TreeNode pRootOfTree) {
      TreeNode ans = null;
      TreeNode cur = pRootOfTree;
      while (cur != null) {
        if (cur.left == null) {  // visit node if no left child
          // first visited node of inOrderTraversal is the list head
          if (lastVisited == null) ans = cur;
          visit(cur);
          cur = cur.right;
        } else {
          TreeNode pred = findPredecessor(cur);
          if (pred.right == null) {
            pred.right = cur;
            cur = cur.left;
          } else {
            // pred.right == null; 这步可有可无
            visit(cur);
            cur = cur.right;
          }
        }
      }
      return ans;
    }
  
    // Append cur to lastVisited to build list.
    void visit(TreeNode cur) {
      if (lastVisited != null) {
        lastVisited.right = cur;
        cur.left = lastVisited;
      }
      lastVisited = cur;
    }
  
    TreeNode findPredecessor(TreeNode cur) {
      TreeNode n = cur.left;
      while (n.right != null && n.right != cur) 
        n = n.right;
      
      return n;
    }
}
全部评论
我第一眼也想到了左程云Morris算法,后来看题写的分治,我就想肯定递归。
点赞 回复 分享
发布于 2022-03-24 21:39

相关推荐

11-15 17:19
湖南大学 Java
成果成果成果果:这是哪个公司的hr,这么离谱吗,我没见过用性别卡技术岗的,身边女性同学拿大厂offer的比比皆是
点赞 评论 收藏
分享
评论
2
收藏
分享
牛客网
牛客企业服务