114二叉树展开为链表

题目描述

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

思路分析

  • 思路一:每次都将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;
    }
发布了117 篇原创文章 · 获赞 8 · 访问量 3695

猜你喜欢

转载自blog.csdn.net/qq_34761012/article/details/104578445