力扣链接:https://leetcode-cn.com/problems/er-cha-sou-suo-shu-yu-shuang-xiang-lian-biao-lcof/
题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。
思路
二叉搜索树的中序遍历结果即是排序的序列,因此我们只需要在中序遍历的过程中处理每一个被遍历到的节点的left&right指向,并找到最终要返回的head节点。
pre:当前遍历到的节点的上一个节点
cur:当前遍历到的节点
代码:
/** * // 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; //中序遍历,记录上一个节点pre,每遍历一个节点调整一次链表 let head = null; let pre = head; inorder(root); //中序遍历后pre指向最右边的节点,将其与头节点接上 pre.right = head; head.left = pre; return head; function inorder(cur){ if(!cur) return; inorder(cur.left); //处理当前节点 if(!pre){ head = cur; }else{ pre.right = cur; } cur.left = pre; pre = cur; inorder(cur.right); } };
时间复杂度:O(N)
空间复杂度:O(1)
易错:
pre一定要设为全局变量,不能作为参数随中序遍历传递。如果将pre放在inorder函数中(eg. inorder(cur, pre)),pre = cur 只是将形参pre指向了新的地址,并没有改变外部pre的值。
原文:https://www.cnblogs.com/xintangchn/p/13197264.html