一、题目

二、题目分析
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.左边循环完后,我们还得循环一边右边;
四、代码
浙公网安备 33010602011771号