二叉树非递归遍历

前提

 1 public class TreeNode {
 2     int val;
 3     TreeNode left;
 4     TreeNode right;
 5 
 6     TreeNode() {
 7     }
 8 
 9     TreeNode(int val) {
10         this.val = val;
11     }
12 
13     TreeNode(int val, TreeNode left, TreeNode right) {
14         this.val = val;
15         this.left = left;
16         this.right = right;
17     }
18 }
19 
20 // 构造二叉树
21 TreeNode node = new TreeNode(5);
22 node.right = new TreeNode(3);
23 TreeNode left = node.left = new TreeNode(1);
24 left.left = new TreeNode(2);
25 left.right = new TreeNode(4);

前序

 1     private static List<Integer> preorderTraversal(TreeNode head) {
 2         List<Integer> res = new ArrayList<>();
 3         if (head == null) {
 4             return res;
 5         }
 6         
 7         Stack<TreeNode> stack = new Stack<>();
 8         stack.push(head);
 9         while (!stack.isEmpty()) {
10             TreeNode top = stack.pop();
11             res.add(top.val);
12             if (top.right != null) {
13                 stack.push(top.right);
14             }
15             if (top.left != null) {
16                 stack.push(top.left);
17             }
18         }
19         System.out.println(res);
20         return res;
21     }

后序

private static List<Integer> postorderTraversal(TreeNode root) {

        List<Integer> res = new LinkedList<>();
        if (root == null) {
            return res;
        }
        Stack<TreeNode> stack = new Stack<>();
        stack.push(root);
        while (!stack.isEmpty()) {
            TreeNode top = stack.pop();
            res.add(0, top.val);
            if (top.left != null) {
                stack.push(top.left);
            }
            if (top.right != null) {
                stack.push(top.right);
            }
        }
        System.out.println(res);
        return res;
    }

中序

private static List<Integer>  inorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<>();
        if (root == null) {
            return res;
        }
        Stack<TreeNode> stack = new Stack<>();

        while (root != null || !stack.isEmpty()) {
            if (root != null) {
                stack.push(root);
                root = root.left;
                continue;
            }
            TreeNode top = stack.pop();
            res.add(top.val);
            root = top.right;
        }
        System.out.println(res);
        return res;
    }

 附录

递归代码

 1 public static List<Integer> res = new ArrayList<>();
 2 private static List<Integer> preorderTraversalRecur(TreeNode head) {
 3   if (head == null) {
 4     return res;
 5   }
 6   // 这里放其他位置,就是前序/中序/后序遍历  
 7   res.add(head.val);
 8   preorderTraversalRecur(head.left);
 9   preorderTraversalRecur(head.right);
10   return res;
11 }

原文地址:https://www.cnblogs.com/wenbochang/p/14491245.html