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

Posted on 2022-03-27 23:07  AcTourist  阅读(12)  评论(0)    收藏  举报

一、题目

 

 二、题目分析

  1.在题目分析中我们要解决一下问题: (1)双向链表 (2)头尾链接(循环链表)

  2.二叉树:左子节点的值总是小于父节点的值,右子节点的值总是大于父节点的值;所以我们可以类比,左边的值小于根的值小于右边的值:左<根<右

  3.在双向链表中,不仅每个节点都有两个指针

/**
 * // 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 == null ) return null;
    let head, pre;
    dfs(root);
    head.left = pre;
    pre.right = head;
    return head;

    function dfs(node) {
        if( !node ) return ;
        dfs(node.left);

        if(!pre) head = node;
        else pre.right = node;
        node.left = pre;//双向链接

        pre = node;//在下次循环前,将pre指向当前Node.
        dfs(node.right);
    }


};

 

,而且链表都是排好序的

三、解决方法

  1.双向链表,我们设置一个前驱节点pre 和 当前节点 node,不仅应构建 pre.right = node;node.left = pre;

  2.头尾链接:我们可以在dfs完后最后设置一个 head.left = pre;pre.right = head;

  3.如果左前节点为空,就说明后节点为链表的第一个位置:head = node;

  4.如果不是,就用 1 的方法进行双向链表链接;

  5.左边循环完后,我们还得循环一边右边;

四、代码