📜  门| GATE-CS-2014-(Set-3) |第 44 题(1)

📅  最后修改于: 2023-12-03 14:58:29.354000             🧑  作者: Mango

题目44介绍:

问题描述:

给出一棵二叉树,编写一个算法,将其转换为双向链表,该链表是按照中序遍历排列的。

输入:

函数接收一个二叉树的根节点。

输出:

返回双向链表的头节点。

例子:

输入:

         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,并将最后一个节点的右指针和头节点的左指针完成连接,此时整个双向链表的连接就完成了。

这样,我们就完成了这道题目的解答。