拍平二叉树

拍平二叉树

问题

这个题目说的是,给你一棵二叉树,你要将它拍平,使得每个节点都只有右子树,并且拍平后的二叉树从上到下的节点是原二叉树前序遍历的结果。

比如说,给你的二叉树是:

      0
    /   \
   1     2
  / \     \
 4   8    16

将它拍平后,得到的二叉树是:

  0
   \
    1
     \
      4
       \
        8
         \
          2
           \
           16

代码

public class AlgoCasts {

  public class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;

    TreeNode(int x) {
      val = x;
    }
  }

  private void preorder(TreeNode root, List<TreeNode> list) {
    if (root == null) return;
    list.add(root);
    preorder(root.left, list);
    preorder(root.right, list);
  }

  // Time: O(n), Space: O(n)
  public void flattenPreorder(TreeNode root) {
    if (root == null) return;
    List<TreeNode> list = new ArrayList<>();
    preorder(root, list);
    TreeNode cur = root;
    for (int i = 1; i < list.size(); ++i) {
      cur.left = null;
      cur.right = list.get(i);
      cur = cur.right;
    }
  }

  private TreeNode prev = null;

  // Time: O(n), Space: O(n)
  public void flattenReversePreorder(TreeNode root) {
    if (root == null) return;
    flattenReversePreorder(root.right);
    flattenReversePreorder(root.left);
    root.left = null;
    root.right = prev;
    prev = root;
  }

}

  转载请注明: ForwardXu 拍平二叉树

 上一篇
青蛙跳台阶一阶、两阶,求n阶的台阶一共几种跳法 青蛙跳台阶一阶、两阶,求n阶的台阶一共几种跳法
青蛙跳台阶一阶、两阶,求n阶的台阶一共几种跳法题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法思路: 得到n个台阶,一共可以跳多少个2步,这个也是一个斐波那契数列的一个应用。对于本题前提只有一
2019-02-15
下一篇 
使用栈实现队列 使用栈实现队列
使用栈实现队列问题 这个题目说的是,你要使用栈来实现一个队列,需要实现队列中常用的 4 个函数。其中,push 函数往队尾加入一个元素;pop 函数把队首元素移除;peek 函数返回队首元素;empty 函数返回队列是否为空。另外你的实现不
2019-02-13
  目录