📜  将二叉树展平为链接列表(1)

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

将二叉树展平为链接列表

二叉树是一种常见的树状结构,每个节点最多有两个子节点。在某些情况下,我们需要将二叉树转化为链接列表,使得所有节点按照一定的顺序排列,并且仍然保留其左右子节点的关系。

方法一:递归

一种常见的方法是使用递归来实现。具体实现方式如下:

public void flatten(TreeNode root) {
    // 首先判断边界条件
    if (root == null) {
        return;
    }
    // 将左子树展平
    flatten(root.left);
    // 将右子树展平
    flatten(root.right);
    // 将左子树移到右子树,将原来的右子树接到当前节点的右边
    TreeNode temp = root.right;
    root.right = root.left;
    root.left = null;
    while (root.right != null) {
        root = root.right;
    }
    root.right = temp;
}

上述代码中,我们首先判断边界条件,如果当前节点为空,则直接返回。接着递归地将左子树和右子树展平。最后,我们将左子树移到当前节点的右边,同时将原来的右子树接到当前节点的右边,即可完成节点的展平。

方法二:迭代

除了递归,我们还可以使用迭代的方法来实现。具体实现方式如下:

public void flatten(TreeNode root) {
    if (root == null) {
        return;
    }
    Stack<TreeNode> stack = new Stack<>();
    stack.push(root);
    while (!stack.isEmpty()) {
        TreeNode curr = stack.pop();
        if (curr.right != null) {
            stack.push(curr.right);
        }
        if (curr.left != null) {
            stack.push(curr.left);
        }
        // 将当前节点的左子树置为空,右子树指向栈顶元素
        if (!stack.isEmpty()) {
            curr.left = null;
            curr.right = stack.peek();
        }
    }
}

上述代码中,我们使用一个栈来存储节点。首先,我们将根节点入栈。接着,每次从栈中弹出一个节点,并将其右子树和左子树依次入栈。最后,我们将当前节点的左子树置为空,右子树指向栈顶元素。重复此过程直至栈为空,即可完成节点的展平。

总结

将二叉树展平为链接列表是一道经典的算法问题,在代码实现时可以采用递归或迭代的方式。这里介绍了两种不同的实现方式,大家可以根据自己的喜好来选择。