百度这张图说明了所有问题,前序遍历得到的结果,root 在最前方。
后序遍历得到的结果,root在最后。
中序遍历得到的结果,root 在中央。
所以leetcode上有关traversal的题目,给定preorder 和 inorder 的结果,tree可还原。
给定postorder和inorder的结果,tree可还原。
关于遍历的代码:
rec写法很简单:
private ArrayList<Integer> result = new ArrayList<Integer>(); public ArrayList<Integer> inorderTraversal(TreeNode root) { if(root!=null){ inorderTraversal(root.left); result.add(root.val); inorderTraversal(root.right); } return result; }
public ArrayList<Integer> preorderTraversal(TreeNode root) { if(root!=null){ result.add(root.val); preorderTraversal(root.left); preorderTraversal(root.right); } return result; }
public ArrayList<Integer> postorderTraversal(TreeNode root) { if (root != null) { postorderTraversal(root.left); postorderTraversal(root.right); result.add(root.val); } return result; }
如果要用iterate, 那就稍微麻烦,用stack做。
public ArrayList<Integer> inorderTraversal(TreeNode root){ ArrayList<Integer> result = new ArrayList<Integer>(); TreeNode p = root; Stack<TreeNode> st = new Stack<TreeNode>(); while(!st.isEmpty()||p!=null){ if(p!=null){ st.push(p); p = p.left; }else{ p = st.pop(); result.add(p.val); p = p.right; } } return result; }
public ArrayList<Integer> preorderTraversal2(TreeNode root){ ArrayList<Integer> result = new ArrayList<Integer>(); TreeNode p = root; Stack<TreeNode> st = new Stack<TreeNode>(); if(p!=null) st.push(p); while(!st.isEmpty()){ p = st.pop(); result.add(p.val); if(p.right!=null) st.push(p.right); if(p.left!=null) st.push(p.left); } return result; }
public ArrayList<Integer> postorderTraversal2(TreeNode root){ ArrayList<Integer> result = new ArrayList<Integer>(); TreeNode cur, pre; Stack<TreeNode> st = new Stack<TreeNode>(); cur = root; do{ while(cur!=null){ st.push(cur); cur = cur.left; } pre = null; while(!st.isEmpty()){ cur = st.pop(); if(cur.right==pre){ result.add(cur.val); pre = cur; }else{ st.push(cur); cur = cur.right; break; } } }while(!st.isEmpty()); return result; }
原文:http://blog.csdn.net/yiding_he/article/details/19146167