【刷算法】二叉搜索树与双向链表

简介: 【刷算法】二叉搜索树与双向链表

题目描述


输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。


分析


如果是这样一棵二叉搜索树:

image.png

那么它对应的双向链表顺序为:

1 3 4 5 7 10 11 15
复制代码

仔细观察发现这个序列和树的中序遍历是一样的,所以算法就好写了,先中序遍历得到一个序列,然后再按照双向链表的指针规则链接起来即可。


代码实现


/* function TreeNode(x) {
    this.val = x;
    this.left = null;
    this.right = null;
} */
function Convert(r)
{
    if(r === null)
        return r;
    var q = [], s = [];
    var cur = r;
    while(cur !== null || s.length !== 0) {
        if(cur !== null){
            s.push(cur);
            cur = cur.left;
        }else{
            cur = s.pop();
            q.push(cur);
            cur = cur.right;
        }
    }
    r = q.shift();
    r.left = null;
    r.right = null;
    var tail = r;
    cur = null;
    while(q.length !== 0){
        cur = q.shift();
        tail.right = cur;
        cur.left = tail;
        tail = cur;
    }
    return r;
}



相关文章
|
29天前
|
算法
【C算法】链表算法
【C算法】链表算法
|
4天前
|
存储 算法 C#
C#二叉搜索树算法
C#二叉搜索树算法
|
28天前
|
算法
【算法】合并两个有序链表(easy)——递归算法
【算法】合并两个有序链表(easy)——递归算法
【算法】合并两个有序链表(easy)——递归算法
|
26天前
|
算法
【数据结构与算法】共享双向链表
【数据结构与算法】共享双向链表
10 0
|
26天前
|
算法
【数据结构与算法】双向链表
【数据结构与算法】双向链表
10 0
|
26天前
|
算法
【数据结构与算法】循环链表
【数据结构与算法】循环链表
10 0
|
26天前
|
存储 算法
【数据结构与算法】链表
【数据结构与算法】链表
15 0
|
1月前
|
算法 Java
LeetCode初级算法题:环形链表+排列硬币+合并两个有序数组java解法
LeetCode初级算法题:环形链表+排列硬币+合并两个有序数组java解法
40 0
|
1月前
|
存储 算法 Java
LeetCode初级算法题:反转链表+统计N以内的素数+删除排序数组中的重复项Java详解
LeetCode初级算法题:反转链表+统计N以内的素数+删除排序数组中的重复项Java详解
17 0
|
3月前
|
算法 Java
Java数据结构与算法:双向链表
Java数据结构与算法:双向链表