欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

114二叉树展开为链表

程序员文章站 2022-05-20 19:09:51
...

题目描述

给定一个二叉树,原地将它展开为链表。

思路分析

  • 思路一:每次都将root的右子树转移到左子树的最右结点。
  • 思路二:如果用前序递归解,将root的右子树存储,再递归转移,会超时。所以可以使用后序遍历解,这样就不会有子树结点问题。

代码实现

    /**
     * 非递归解法
     *
     * @param root
     */
    public void flatten(TreeNode root) {
        if (root == null) {
            return;
        }
        while (root != null) {
            if (root.left == null) {
                root = root.right;
            } else {
                TreeNode pre = root.left;
                while (pre.right != null) {
                    pre = pre.right;
                }
                pre.right = root.right;
                root.right = root.left;
                root.left = null;
                root = root.right;
            }
        }
    }

    /**
     * 递归解法,后序遍历
     */
    private TreeNode pre = null;

    public void flatten1(TreeNode root) {
        if (root == null) {
            return;
        }
        flatten1(root.right);
        flatten1(root.left);
        root.right = pre;
        root.left = null;
        pre = root;
    }
相关标签: leetcodeBinaryTree