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

155 阅读1分钟

题目

image.png

思路

  • 把二叉搜索树转为循环双向链表
  • 中序遍历递归实现

代码

class Solution {
    Node pre, head;//pre节点表示前一个节点,head为头节点
    public Node treeToDoublyList(Node root) {
        if (root == null) return head;//特判
        dfs(root);
        head.left = pre;//头连到尾,dfs截止后,pre停在最后一个节点
        pre.right = head;//尾连到头
        return head;
    }
    
    //中序遍历
    public void dfs(Node root) {
        if (root == null) {
            return;
        }
        dfs(root.left);//
        if (pre == null) { // 一开始一直向左搜索,pre一直未初始化,为null
            head = root;//没有pre了,说明当前节点是head
        } else {
            pre.right = root;//前一个节点指向当前节点
            root.left = pre;//当前节点指向前一个节点
        }
        pre = root;//更新pre为当前节点
        dfs(root.right);//
    }
}