首页 理论教育 Kotlin程序员必备算法:快速转换二叉树为双向链表

Kotlin程序员必备算法:快速转换二叉树为双向链表

时间:2023-10-31 理论教育 版权反馈
【摘要】:实现思路如下图所示:假设当前遍历的结点为root,root的左子树已经被转换为双向链表,使用两个变量pHead与pEnd分别指向链表的头结点与尾结点。

Kotlin程序员必备算法:快速转换二叉树为双向链表

【出自XL笔试题】

难度系数:★★★★☆ 被考察系数:★★★★☆

题目描述:

输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整结点的指向。例如:

分析与解答:

由于转换后的双向链表中结点的顺序与二叉树的中序遍历的顺序相同,因此,可以对二叉树的中序遍历算法进行修改,通过在中序遍历的过程中修改结点的指向来转换成一个排序的双向链表。实现思路如下图所示:假设当前遍历的结点为root,root的左子树已经被转换为双向链表(如下图(1)所示),使用两个变量pHead与pEnd分别指向链表的头结点与尾结点。那么在遍历root结点的时候,只需要将root结点的lchild(左)指向pEnd,把pEnd的rchild(右)指向root;此时root结点就被加入到双向链表里了,因此,root变成了双向链表的尾结点。对于所有的结点都可以通过同样的方法来修改结点的指向。因此,可以采用递归的方法来求解,在求解的时候需要特别注意递归的结束条件以及边界情况(例如双向链表为空的时候)。

实现代码如下:(www.xing528.com)

程序的运行结果如下:

转换后双向链表正向遍历:1 2 3 4 5 6 7

转换后双向链表逆向遍历:7 6 5 4 3 2 1

算法性能分析:

这种方法与二叉树的中序遍历有着相同的时间复杂度O(N)。此外,这种方法只用了两个额外的变量pHead与pEnd来记录双向链表的首尾结点,因此,空间复杂度为O(1)。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈