📌  相关文章
📜  数据结构示例-二叉树转换为双向链表(1)

📅  最后修改于: 2023-12-03 15:10:20.595000             🧑  作者: Mango

数据结构示例-二叉树转换为双向链表

简介

在二叉树中,每个节点有左右两个指针。将二叉树转换为双向链表,意味着将每个节点的指针都指向其在链表中的前驱和后继节点。这样可以在O(1)时间内访问链表中的任意一个节点,方便查找和遍历。

算法流程
  1. 对于二叉树的每个节点,先将其左子节点递归转换为双向链表,并返回左子树的头节点和尾节点。
  2. 将当前节点插入到左子树的尾节点之后,更新尾节点为当前节点。
  3. 再将右子节点递归转换为双向链表,并返回右子树的头节点和尾节点。
  4. 将右子树的头节点插入到当前节点之后,更新尾节点为右子树的尾节点。
  5. 最后返回当前节点作为新的头节点。
代码实现

下面是Java语言实现的代码片段:

class TreeNode{
    int val;
    TreeNode left;
    TreeNode right;
    TreeNode(int val){
        this.val = val;
    }
}

public class Solution{
    public TreeNode treeToDoublyList(TreeNode root){
        if(root == null) return null;
        TreeNode[] res = dfs(root);
        res[0].left = res[1];
        res[1].right = res[0];
        return res[0];
    }
    
    private TreeNode[] dfs(TreeNode root){
        TreeNode[] res = new TreeNode[]{root, root};
        if(root.left != null){
            TreeNode[] left = dfs(root.left);
            left[1].right = root;
            root.left = left[1];
            res[0] = left[0];
        }
        if(root.right != null){
            TreeNode[] right = dfs(root.right);
            right[0].left = root;
            root.right = right[0];
            res[1] = right[1];
        }
        return res;
    }
}
时间复杂度

每个节点仅被访问一次,所以时间复杂度为O(n),其中n为节点数。