📅  最后修改于: 2023-12-03 14:58:29.354000             🧑  作者: Mango
给出一棵二叉树,编写一个算法,将其转换为双向链表,该链表是按照中序遍历排列的。
函数接收一个二叉树的根节点。
返回双向链表的头节点。
输入:
4
/ \
2 5
/ \
1 3
输出:
1<->2<->3<->4<->5
这将是一个双向链表,其节点显示按照二进制搜索树中序遍历的顺序排列。此外,返回的头节点必须是排在第一个节点的最小值。
题目要求将二叉树转换为双向链表,因此可以考虑使用递归方法,用中序遍历的方式遍历二叉树,并在遍历过程中修改每个节点的指向。
具体地,假设当前遍历到节点 root
,则需要将其左右子树都转换为双向链表。并且,转换好左右子树后,需要将 root
节点的左指针指向左子树双向链表的最后一个节点,将 root
节点的右指针指向右子树双向链表的第一个节点,最后返回整个节点双向链表的头节点。
下面是python的实现代码。代码片段使用的是GFM(github flavored markdown)格式。
class TreeNode(object):
def __init__(self, val):
self.val = val
self.left = None
self.right = None
class Solution(object):
def __init__(self):
self.pre = None
self.head = None
def treeToDoublyList(self, root):
if not root:
return None
self.dfs(root)
self.head.left = self.pre
self.pre.right = self.head
return self.head
def dfs(self, cur):
if not cur:
return
self.dfs(cur.left)
if self.pre:
self.pre.right = cur
cur.left = self.pre
else:
self.head = cur
self.pre = cur
self.dfs(cur.right)
代码解释:
上述代码中,我们使用一个 pre
变量来表示当前节点的前一个节点,使用一个 head
变量来表示整个树的头节点。
首先,我们对根节点开始递归,使用中序遍历的方式遍历整棵二叉树。
在遍历左子树时,我们会用实现上一次递归调用时设置的 pre
指向左子树双向链表的最后一个节点,然后将该节点的右指针指向当前节点。这样,左子树中所有节点的右指针和当前节点的左指针就完成了连接。
当遍历到根节点时,我们通过检查 pre
是否为 None
来判断是否为双向链表的起始节点。然后,我们让当前根节点成为当前双向链表的头节点,并用 head
来保存。
接着,我们用当前节点更新 pre
,然后开始遍历右子树。同样,我们将当前节点的左指针指向 pre
,将 pre
的右指针指向当前节点,在遍历右子树时完成了双向链表的连接。
最后,我们返回头节点 head
,并将最后一个节点的右指针和头节点的左指针完成连接,此时整个双向链表的连接就完成了。
这样,我们就完成了这道题目的解答。