LeetCode ---- 114、二叉树展开为链表

题目链接

思路:

对每一棵子树来说,都是将其左子树连在根节点与右子树之间

选择后序遍历,先处理左子树和右子树,之后处理根节点

每一次将左子树连接完成之后,都需要将右子树连接在当前右子树的最右位置

举例:如下树

    1
   / \
  2   5
 / \   \
3   4   6

展开过程为:

处理节点3、4       处理节点2           处理节点5          处理节点1
    1                1                  1                  1
   / \             /   \               /  \                 \
  2   5    ->     2     5       ->    2    5       ->        2
 / \   \           \     \             \    \                 \
3   4   6           3     6             3    6                 3
                     \                   \                      \
                      4                   4                      4
                                                                  \
                                                                   5
                                                                    \  
                                                                     6                          

代码如下:

    public void flatten(TreeNode root) {
        if (root == null) {
            return;
        }
        flatten(root.left);
        flatten(root.right);
        TreeNode tmp = root.right;
        root.right = root.left;
        root.left = null;
        while (root.right != null) {
            root = root.right;
        }
        root.right = tmp;
    }
    class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;
        TreeNode(int x) { val = x; }
    }

参考链接:https://leetcode-cn.com/problems/flatten-binary-tree-to-linked-list/comments/71016

猜你喜欢

转载自blog.csdn.net/sinat_34679453/article/details/107676062