二叉搜索树与双向链表
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
思路
解法一: 基础的递归
1.构建左子树为双向链表,返回链表头节点left
2.定位到左双向链表最后一个节点
3.左双向链表最后一个节点与当前节点双向链接
4.构建右子树为双向链表,返回链表头结点right
5.将右双向链表头节点和当前节点连接起来
解法二:
使用全局变量leftLast来表示左双向链表的最后一个节点(也就是上一种解法中的tmp)
代码
function Permutation(str) {
var result = [];
if (str.length <= 0) {
return [];
}
var sortTemp= "";
var arr = str.split("");
result = sortString(arr, sortTemp, []);
return result;
}
function sortString(arr, sortTemp, res) {
if (arr.length == 0) {
res.push(sortTemp);
} else {
var isRepeat = {};
for (var i = 0; i < arr.length; i++) {
if (!isRepeat[arr[i]]) {
var temp = arr.splice(i, 1)[0]; // 取出第i个字符
sortTemp+= temp; // 第i个字符设为前缀
sortString(arr, sortTemp, res);
arr.splice(i, 0, temp); // 补全取出的元素,恢复原字符串
sortTmp= sortTemp.slice(0, sortTemp.length - 1); // 清空sortTemp
isRepeat[temp] = tru;
}
}
}
return res;
}
//第二种
/* function TreeNode(x) {
this.val = x;
this.left = null;
this.right = null;
} */
var leftLast;
function Convert(root)
{
// write code here
if(!root){
return null;
}
//返回最左边的头节点,并且此时左双向链表的最后一个节点也是该节点
if(root == null && root == null){
leftLast = root;
return root;
}
//构建左子树为双向链表,返回链表头节点left
var left = Convert(root.left);
//若左子树存在,则将左双向链表最后一个节点与当前节点连接起来
//这里,leftLast和left的存在与否并不完全一致哦!
if(left){
leftLast.right = root;
root.left = leftLast;
}
//那么此时不论有没有left,左双向链表的最后一个节点都是当前root啦
leftLast = root;
//构建右子树为双向链表,返回链表头结点right
var right = Convert(root.right);
//将右双向链表头节点和当前节点连接起来
if(right){
right.left = root;
root.right = right;
}
//若有左子树,返回的永远是最左边的叶子节点(也就是最小的节点),若无左子树,则根节点就是最小的节点
return left?left:root;
}