原题链接:
http://oj.leetcode.com/problems/flatten-binary-tree-to-linked-list/
这是树的题目,要求把一颗二叉树按照先序遍历顺序展成一个链表,不过这个链表还是用树的结果,就是一直往右走(没有左孩子)来模拟链表。老套路还是用递归来解决,维护先序遍历的前一个结点pre,然后每次把pre的左结点置空,右结点设为当前结点。这里需要注意的一个问题就是我们要先把右子结点保存一下,以便等会可以进行递归,否则有可能当前结点的右结点会被覆盖,后面就取不到了。算法的复杂度时间上还是一次遍历,O(n)。空间上是栈的大小,O(logn)。代码如下:
这是树的题目,要求把一颗二叉树按照先序遍历顺序展成一个链表,不过这个链表还是用树的结果,就是一直往右走(没有左孩子)来模拟链表。老套路还是用递归来解决,维护先序遍历的前一个结点pre,然后每次把pre的左结点置空,右结点设为当前结点。这里需要注意的一个问题就是我们要先把右子结点保存一下,以便等会可以进行递归,否则有可能当前结点的右结点会被覆盖,后面就取不到了。算法的复杂度时间上还是一次遍历,O(n)。空间上是栈的大小,O(logn)。代码如下:
public void flatten(TreeNode root) { ArrayList<TreeNode> pre = new ArrayList<TreeNode>(); pre.add(null); helper(root, pre);}private void helper(TreeNode root, ArrayList<TreeNode> pre){ if(root == null) return; TreeNode right = root.right; if(pre.get(0)!=null) { pre.get(0).left = null; pre.get(0).right = root; } pre.set(0,root); helper(root.left, pre); helper(right, pre);}
树的题目讨论得比较多了,主要思路就是递归,考虑好递归条件和结束条件,有时候如果递归过程会对树结构进行修改的话,要先保存一下结点。