二叉搜索树与双向链表 2022-03-01 周一

2022-03-01  本文已影响0人  勇往直前888

题目

输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。

学习

题目图解

参考1

参考2

思路

JS代码

/**
 * // Definition for a Node.
 * function Node(val,left,right) {
 *    this.val = val;
 *    this.left = left;
 *    this.right = right;
 * };
 */
/**
 * @param {Node} root
 * @return {Node}
 */
var treeToDoublyList = function(root) {
    // 判空
    if (!root) {
        return null;
    }

    // 定义中序遍历内部方法
    let head = null;
    let previous = null; // 移动到最后,就是tail

    const inOrder = (current) => {
        if (!current) {
            return;
        }

        // 中序遍历,先递归左子树
        inOrder(current.left);

        // 设置前驱节点
        // 如果前置指针空了,那么是头结点
        if (!previous) {
            head = current;
        } else {
            previous.right = current;
            current.left = previous;
        }
        
        // 移动前置节点到当前,然后继续遍历右子树去了
        previous = current;

        // 遍历右子树
        inOrder(current.right);
    }

    // 执行中序遍历
    inOrder(root);

    // 甚至循环链表
    // 中序遍历之后,previous就是尾结点tail
    head.left = previous;
    previous.right = head;

    // 返回头节点
    return head;
};

备注

中序遍历作为内部函数,有点不好理解。

上一篇 下一篇

猜你喜欢

热点阅读