非递归形式的前中后序遍历,有一篇文章说得比较详细http://www.cnblogs.com/dolphin0520/archive/2011/08/25/2153720.html
PreOrder:
public class Solution { List<Integer> rst = new ArrayList<Integer>(); Stack<TreeNode> stack = new Stack<TreeNode>(); public List<Integer> preorderTraversal(TreeNode root) { if(root == null) return rst; // 先一直往左边走,同时把right child保存到stack,当左边遍历完了,就一个个弹出栈 while(root != null) { // 先一直往左走 while(root != null) { rst.add(root.val); stack.push(root); root = root.left; } // 往右 while(!stack.isEmpty()) { root = stack.pop(); root = root.right; if(root != null) break; } } return rst; } }可以写简单点
class Solution: def inorderTraversal(self, root): """ :type root: TreeNode :rtype: List[int] """ st=[] res=[] while st or root: while root: st.append(root) root=root.left if st: t = st.pop() res.append(t.val) root = t.right return res如果是多叉树,就得一次性把所有的child加到stack里,注意不同的遍历对应加的原始数组还是resverse
后序遍历在Discuss里有一个解法比较简单,描述如下,简单修改PreOrder的代码即可:
pre-order traversal is root-left-right, and post order is left-right-root. modify the code
for pre-order to make it root-right-left, and then reverse the output so that we can get
left-right-root .
public class Solution { List<Integer> rst = new ArrayList<Integer>(); Stack<TreeNode> stack = new Stack<TreeNode>(); public List<Integer> postorderTraversal(TreeNode root) { if(root == null) return rst; while(root != null) { while(root != null) { rst.add(root.val); stack.push(root); root = root.right; } while(!stack.isEmpty()) { root = stack.pop(); root = root.left; if(root != null) break; } } Collections.reverse(rst); return rst; } }
