二叉樹非遞迴遍歷Java實現
阿新 • • 發佈:2018-12-26
二叉樹的前序、中序和後序遍歷可以採用遞迴和非遞迴的方法實現,遞迴的方法邏輯簡單清晰,易於理解,但遞迴的方法需要使用額外的棧空間,執行效率較低。而非遞迴的方法則效率較高。
下面是相應的Java實現:
前序遍歷(非遞迴實現):
public static void preOrder(TreeNode x) { System.out.println(); if(x!=null) { LinkedList<TreeNode> stack=new LinkedList<TreeNode>(); stack.addLast(x); while(!stack.isEmpty()) { TreeNode temp=stack.removeLast(); System.out.print(temp.val+" "); if(temp.rchild!=null) { stack.addLast(temp.rchild); } if(temp.lchild!=null) { stack.addLast(temp.lchild); } } System.out.println(); } }
中序遍歷(非遞迴實現):
public static void inOrder(TreeNode x) { System.out.println(); if(x!=null) { LinkedList<TreeNode> stack=new LinkedList<TreeNode>(); while(!stack.isEmpty()||x!=null) { if(x!=null) { stack.addLast(x); x=x.lchild; } else { x=stack.removeLast(); System.out.print(x.val+" "); x=x.rchild; } } System.out.println(); } }
後序遍歷(非遞迴實現):
public static void postOrderII(TreeNode x) { LinkedList<TreeNode> stack=new LinkedList<TreeNode>(); TreeNode lastNodeVistited=null; while(!stack.isEmpty()||x!=null) { if(x!=null) { stack.addLast(x); x=x.lchild; } else { TreeNode top=stack.getLast(); if(top.rchild!=null&&lastNodeVistited!=top.rchild) { x=top.rchild; } else { System.out.print(top.val+" "); lastNodeVistited=stack.removeLast(); } } } System.out.println(); }