BST:剑指 Offer 36. 二叉搜索树与双向链表
                
            
             
        
            
            原题地址:https://leetcode.cn/problems/er-cha-sou-suo-shu-yu-shuang-xiang-lian-biao-lcof/ 
题解
对于一个节点,我们先求出左子树的链表形态和右子树的链表形态
- 对于这个节点,其前驱等于左子树链表的最后一个元素
 
- 对于这个节点,其后驱等于右子树链表的第一个元素
 
此时我们将这个节点的左子树+自己+右子树重新整合成一个链表
- 同理地,对于这个节点的父节点
 
- 若该节点为父节点的左节点,则返回整合后链表的最后一个元素
 
- 若该节点为父节点的右节点,则返回整合后链表的第一个元素
 
当根节点整合完毕后,找到链表的第一个元素first和最后一个元素end,连接first的left和end的right,然后返回first节点即可
时间复杂度:O(N)
空间复杂度:O(1)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
   | class Solution {     public Node treeToDoublyList(Node root) {         Node node=DFS(root,null);         return node;     }
      Node DFS(Node node,Node parent){         if(node==null)return null;         node.left=DFS(node.left,node);         if(node.left!=null)node.left.right=node;         node.right=DFS(node.right,node);         if(node.right!=null)node.right.left=node;
 
          if(parent==null){             Node first=node,end=node;             while(first.left!=null){                 first=first.left;             }             while(end.right!=null){                 end=end.right;             }             first.left=end;             end.right=first;             return first;         }else if(node==parent.left){             while(node.right!=null){                 node=node.right;             }             return node;         }else if(node==parent.right){             while(node.left!=null){                 node=node.left;             }             return node;         }         return node;     } }
  |