题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。
我们希望将这个二叉搜索树转化为双向循环链表。链表中的每个节点都有一个前驱和后继指针。对于双向循环链表,第一个节点的前驱是最后一个节点,最后一个节点的后继是第一个节点。
当转化完成以后,树中节点的左指针需要指向前驱,树中节点的右指针需要指向后继。还需要返回链表中的第一个节点的指针。
题目解答
大概思路:
对于二叉搜索树来说,中序遍历的结果就是将各节点从小到大排列。
正确版本Ⅰ:
var treeToDoublyList = function(root) {
if(!root){
return ;
}
let head = null;
let lastNode = head;
coverNode(root);
// 返回头节点
head.left = lastNode;
lastNode.right = head;
return head;
function coverNode(pNode){
if(pNode==null){
return;
}
if(pNode.left!=null){
coverNode(pNode.left,lastNode);
}
pNode.left = lastNode;
if(!lastNode){
head = pNode;
}
else{
lastNode.right = pNode;
}
lastNode = pNode;
if(pNode.right!=null){
coverNode(pNode.right,lastNode);
}
}
};
另一种获取头指针方法:
lastNode指向尾节点,依次向前遍历找到头节点。(不如上面思路)
var treeToDoublyList = function(root) {
if(!root){
return ;
}
let lastNode = null;
coverNode(root);
let head = lastNode;
// 返回头节点
while(head!=null && head.left!=null){
head = head.left
}
head.left = lastNode;
lastNode.right = head;
return head;
};
提醒:
最开始以下面思路找头指针,结果将while判断写成了if判断,一直没有发现报错原因。害!