题解 | #二叉搜索树与双向链表#

二叉搜索树与双向链表

https://www.nowcoder.com/practice/947f6eb80d944a84850b0538bf0ec3a5

/* function TreeNode(x) {
    this.val = x;
    this.left = null;
    this.right = null;
} */
function Convert(pRootOfTree)
{
    if(!pRootOfTree) return null;
    
    const link = traverse(pRootOfTree);
    return link[0];
}

/**
 * 中序遍历 => 左为前 右为后
 * 
 * 结点的左指针指向前驱,右指针指向后继
 */

function traverse(root, link = []) {
    if(root == null) return null;
    
    traverse(root.left, link);

    const cur = root;
    if(link.length > 0) {
        const last = link[link.length - 1];
        cur.left =  last;
        last.right = cur;
    } else {
        cur.left = null
    }
    link.push(cur);
    
    traverse(root.right, link);

    return link;
}

module.exports = {
    Convert : Convert
};

思路:

输出的双向链表正好是 二叉树 中序遍历的结果,所以自然而然选用 中序遍历。

中序递归遍历是比较简单的。

递归三部曲:

1、确定参数和返回值,这里我们选择传入root,返回 link

2、终止条件 遇到空结点就返回 null

3、单层递归逻辑 就是处理结点的前驱和后继

// [last <- cur]
cur.pre = link[last];
// [last -> cur]
link[last].next = cur;

全部评论

相关推荐

10-06 12:46
门头沟学院 Java
跨考小白:定时任务启动
点赞 评论 收藏
分享
牛客5655:其他公司的面试(事)吗
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务