【中等】二叉搜索树与双向链表- 2.29

69 阅读2分钟

题目链接:

题目描述: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表

image.png

题解:

/* function TreeNode(x) {
    this.val = x;
    this.left = null;
    this.right = null;
} */
function Convert(pRootOfTree)
{
    // write code here
    // 定义头结点和前驱结点
    let head = null, pre = null

    // 中序遍历的递归函数
    function MediumOrderDFS(cur) {
        // 如果当前结点为空,直接返回
        if (cur === null) return

        // 递归遍历左子树
        MediumOrderDFS(cur.left)

        // 处理当前结点
        if (pre === null) {
            // 如果前驱结点为空,说明当前结点是最左边的结点,将其设置为头结点
            head = cur
        } else {
            // 否则,将前驱结点的右指针指向当前结点
            pre.right = cur
        }

        // 将当前结点的左指针指向前驱结点
        cur.left = pre

        // 更新前驱结点为当前结点
        pre = cur

        // 递归遍历右子树
        MediumOrderDFS(cur.right)
    }

    MediumOrderDFS(pRootOfTree)

    // 返回转换后的链表头结点
    return head
}

总结:

  1. Convert(pRootOfTree) 函数接收一个二叉搜索树的根节点 pRootOfTree 作为参数,返回转换后的双向链表的头节点。

  2. 在函数内部,我们定义了两个变量 head 和 pre,分别表示双向链表的头节点和前一个节点。

  3. 紧接着是 MediumOrderDFS(cur) 函数的定义,它是一个中序遍历的递归函数,用来遍历二叉树并完成双向链表的转换。参数 cur 表示当前处理的节点。

  4. 在 MediumOrderDFS 中,首先进行递归的左子树遍历:MediumOrderDFS(cur.left);

  5. 接着是处理当前节点的逻辑:

  • 如果 pre === null,说明当前节点是最左边的节点,将其设为头节点 head = cur; - 否则,将前驱节点的右指针指向当前节点 pre.right = cur;

  • 将当前节点的左指针指向前驱节点 cur.left = pre;

  • 更新前驱节点为当前节点 pre = cur;

  1. 最后进行递归的右子树遍历:MediumOrderDFS(cur.right);
  2. 函数执行完毕后,返回头节点 head,即为转换后的双向链表的头。