思路
訪問順序和處理順序不一致導致迭代法難寫,體現在總要先遍歷根節點,才能訪問左右孩子,用null標記,null標記的節點表示已經訪問過了,下一次可以處理,所以在當前棧頂節點不是null的時候,都要進行入棧,由于是左根右的處理順序,所以壓棧的時候要右根左壓棧。
代碼
import java.util.Stack;public class InOrderTraversalBinaryTree {static class TreeNode{int val;TreeNode left;TreeNode right;TreeNode(int v){this.val = v;this.left = null;this.right = null;}}static void InOrderTra(TreeNode root){if(root == null) return;if(root.left != null) InOrderTra(root.left);System.out.println(root.val);if(root.right != null) InOrderTra(root.right);}public static void main(String[] args) {TreeNode root = new TreeNode(7);TreeNode left = new TreeNode(3);TreeNode right = new TreeNode(10);root.left = left;root.right = right;
// 遞歸法
// InOrderTra(root);Stack<TreeNode> st = new Stack<>();if(root != null)st.push(root);while(!st.isEmpty()){TreeNode node = st.peek();if(node != null){st.pop();if(node.right != null) st.push(node.right);st.push(node);st.push(null);if(node.left != null) st.push(node.left);}else{st.pop();node = st.peek();st.pop();System.out.println(node.val);}}}}