1. /*
  2. // Definition for a Node.
  3. class Node {
  4. public int val;
  5. public Node left;
  6. public Node right;
  7. public Node() {}
  8. public Node(int _val) {
  9. val = _val;
  10. }
  11. public Node(int _val,Node _left,Node _right) {
  12. val = _val;
  13. left = _left;
  14. right = _right;
  15. }
  16. };
  17. */
  18. class Solution {
  19. Node head, pre;
  20. public Node treeToDoublyList(Node root) {
  21. if(root==null) return null;
  22. dfs(root);
  23. pre.right = head;
  24. head.left =pre;//进行头节点和尾节点的相互指向,这两句的顺序也是可以颠倒的
  25. return head;
  26. }
  27. public void dfs(Node cur){
  28. if(cur==null) return;
  29. dfs(cur.left);
  30. cur.left = pre;//pre是否为null对这句没有影响,且这句放在上面两句if else之前也是可以的。
  31. //pre用于记录双向链表中位于cur左侧的节点,即上一次迭代中的cur,当pre==null时,cur左侧没有节点,即此时cur为双向链表中的头节点
  32. if(pre==null) head = cur;
  33. //反之,pre!=null时,cur左侧存在节点pre,需要进行pre.right=cur的操作。
  34. else pre.right = cur;
  35. pre = cur;//pre指向当前的cur
  36. dfs(cur.right);//全部迭代完成后,pre指向双向链表中的尾节点
  37. }
  38. // 作者:jyd
  39. // 链接:https://leetcode-cn.com/problems/er-cha-sou-suo-shu-yu-shuang-xiang-lian-biao-lcof/solution/mian-shi-ti-36-er-cha-sou-suo-shu-yu-shuang-xian-5/
  40. }

剑指 Offer 36. 二叉搜索树与双向链表