加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

426. Convert Binary Search Tree to Sorted Doubly Linked List

发布时间:2020-12-14 03:49:40 所属栏目:大数据 来源:网络整理
导读:426 . Convert Binary Search Tree to Sorted Doubly Linked List(AC)Convert a BST to a sorted circular doubly -linked list in- placeIterative(AC)O(n) time,O(h) space. Stack size depends on the,tree’s height /* // Definition for a Node.class
426. Convert Binary Search Tree to Sorted Doubly Linked List(AC)
Convert a BST to a sorted circular doubly-linked list in-place


Iterative(AC)
O(n) time,O(h) space. Stack size depends on the,tree’s height 

/*
// Definition for a Node.
class Node {
    public int val;
    public Node left;
    public Node right;

    public Node() {}

    public Node(int _val,Node _left,Node _right) {
        val = _val;
        left = _left;
        right = _right;
    }
};
*/

class Solution {
    public Node treeToDoublyList(Node root) {
      if(root == null) return null;
      Stack<Node> stack = new Stack<>();
      if(root != null){
        pushLeft(root,stack);
      }
      
      Node first = stack.peek();
      
      while(!stack.isEmpty()){
        Node cur = stack.pop();
        
        if(cur.right != null){
          pushLeft(cur.right,stack);
        }
        
        if(!stack.isEmpty()){ // check if empty
          
          Node peek = stack.peek();
          cur.right = peek;
          peek.left = cur;
        }
        
        if(stack.isEmpty()){
          cur.right = first;
          first.left = cur;
        }
      }
      return first;
    }
  
    private void pushLeft(Node node,Stack<Node> stack){
      while(node != null){ // use while 
        stack.push(node);
        node = node.left;
      }
    }
}

// 写过的题还会出错, 当时花了很长时间把这道题用 iterative 的方法
做了出来, 但是这次再写, 不会写了, 看了答案后, 自己写了一遍, 又
出现了错误。。。
建议: 走例子, 常复习。






// recursive 闫老师笔记 (AC)
O(n) time,O(h) space . Call stack  depends on the tree’s height 

class Solution {
    public Node treeToDoublyList(Node root) {
      if(root == null) return null;
      
      // suppose both left and right are circuler ddl already sepatrely
      // each of them is in their own ddl bubble
      // they are not connected yet 
      Node left = treeToDoublyList(root.left);
      Node right = treeToDoublyList(root.right);
      
      
      // make the root connected with itself,then root is 
      // also a circuler ddl
      root.left = root;
      root.right = root;
      
      
      // connect the left circuler ddl with root circular ddl
      // return the new head,which is the head of left,if 
     // left is not null. if left is null,the new head is the root
      left = connect(left,root);
      
      // connect the new left with the right circular ddl
      // return the new head,if
      // left is not null. return head of right if left is null
      // we just call the return value left,it‘s not necessaitly 
      // the head of the left,if all depends if the left is null
      // or not
      left = connect(left,right);
      
      return left;
        
    }
  
  
    // connect one circular ddl with another circular ddl 
    // 
    private Node connect(Node h1,Node h2){
      if(h1 == null) return h2;
      if(h2 == null) return h1;
      
      Node t1 = h1.left;
      Node t2 = h2.left;
      
      h1.left = t2;
      t2.right = h1;
      
      
      h2.left = t1;
      t1.right = h2;
      
      return h1;
    }
}

// suppose <-1<->2<->3->     1 is h1,3 is t1. 1 and 3 is connected 
//         <-4<->5<->6->     4 is h2,6 is t2. 4 and 6 is connected

// now we want to connect the above circular ddl. 
// we want to get    <-1<->2<->3<->4<->5<->6->
// then h1.prev = t2. t2.next = h1.    t1.next = h2. h2.prev = t1









/////
自己写的, 和闫老师的不太一样的一点是

      
      // connect the left circuler ddl with root circular ddl
      // return the new head,the new head is the root
      Node newHead = connect(left,root);
      
      // connect the new list with the right circular ddl
      // return the new head,which is the head of the new list,if
      // new list is not null. return head of right if the new list is null
      
      newHead= connect(newHead,right);
      
      return newHead;

因为 感觉 用个 newhead 比较 容易理解。 



class Solution {
    public Node treeToDoublyList(Node root) {
      if(root == null) return null;
      
      // suppose both left and right are circuler ddl already sepatrely
      // each of them is in their own ddl bubble
      // they are not connected yet 
      Node left = treeToDoublyList(root.left);
      Node right = treeToDoublyList(root.right);
      
      
      // make the root connected with itself,right);
      
      return newHead;
        
    }
  
  
    // connect one circular ddl with another circular ddl 
    // 
    private Node connect(Node h1,Node h2){
      if(h1 == null) return h2;
      if(h2 == null) return h1;
      
      Node t1 = h1.left;
      Node t2 = h2.left;
      
      h1.left = t2;
      t2.right = h1;
      
      
      h2.left = t1;
      t1.right = h2;
      
      return h1;
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读