标签:
/* * 114. Flatten Binary Tree to Linked List * 2016-5-19 By Mingyang * 注意stack不能用!=null来描述,应该用 * (!stack.isEmpty())来表述!这道题目你会发现好像是根左右的顺序,然后就用stack来写 * 就是一个preorder的变体,在recursive的方法中呢,我们必须用一个全局变量来保存上一个节点的位置,因为 * 我们退回来的时候才可以知道lastNode具体的地方。 */ public void flatten(TreeNode root) { if (root == null) return; Stack<TreeNode> stack = new Stack<TreeNode>(); stack.push(root); TreeNode prev = null; while (!stack.isEmpty()) { TreeNode temp = stack.pop(); if (temp.right != null) stack.push(temp.right); if (temp.left != null) stack.push(temp.left); if (prev != null) { prev.right = temp; prev.left = null; } prev = temp; } } /* * 我在自己写的时候也意识到这个是一个preorder的顺序,不过忘了设置一个全局变量lastNode来连接上下各节点 * 这里就是没访问到一个root都把其赋予lastNode */ private TreeNode lastNode = null;//lastNode就是连接左边和右边的纽带 public void flattenRec(TreeNode root) { if (root == null) { return; } if (lastNode != null) { lastNode.left = null;//这里面就是真正的改变整个TreeNode的部分,相当于preorder的根操作。 lastNode.right = root; } lastNode = root; TreeNode right = root.right;//这不不能省去,因为一旦省去了以后我们就不能记录当时的root.right了 flatten(root.left); flatten(right); }
114. Flatten Binary Tree to Linked List
标签:
原文地址:http://www.cnblogs.com/zmyvszk/p/5511141.html