標籤:二叉樹 後序遍曆 演算法 面試 java
【145-Binary Tree Postorder Traversal(二叉樹非遞迴後序遍曆)】
【LeetCode-面試演算法經典-Java實現】【所有題目目錄索引】
原題
Given a binary tree, return the postorder traversal of its nodes’ values.
For example:
Given binary tree {1,#,2,3},
1 2 / 3
return [3,2,1].
Note: Recursive solution is trivial, could you do it iteratively?
題目大意
給定一個二叉樹,輸出後序遍曆的結果,嘗試使用兩種方法實現
解題思路
第一種:使用遞迴方式。
第二種:使用非遞迴的方法
根據後序遍曆的順序,先訪問左子樹,再訪問右子樹,後訪問根節點,而對於每個子樹來說,又按照同樣的訪問順序進行遍曆,後序遍曆的非遞迴的實現相對來說要難一些,要保證根節點在左子樹和右子樹被訪問後才能訪問,思路如下:
對於任一節點P,
1)先將節點P入棧;
2)若P不存在左孩子和右孩子,或者P存在左孩子或右孩子,但左右孩子已經被輸出,則可以直接輸出節點P,並將其出棧,將出棧節點P標記為上一個輸出的節點,再將此時的棧頂結點設為當前節點;
3)若不滿足2)中的條件,則將P的右孩子和左孩子依次入棧,當前節點重新置為棧頂結點,之後重複操作2);
4)直到棧空,遍曆結束。
代碼實現
結點類
public class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; }}
第一種方法:演算法實作類別
import java.util.LinkedList;import java.util.List;public class Solution { private List<Integer> result; public List<Integer> postorderTraversal(TreeNode root) { result = new LinkedList<>(); preOrder(root); return result; } private void preOrder(TreeNode root) { if (root != null) { preOrder(root.left); preOrder(root.right); result.add(root.val); } }}
第二種方法:演算法實作類別
import java.util.Deque;import java.util.LinkedList;import java.util.List;public class Solution { public List<Integer> postorderTraversal(TreeNode root) { List<Integer> list = new LinkedList<>(); if (root != null) { // 雙端隊列,當作棧來使用 Deque<TreeNode> deque = new LinkedList<>(); // 指向前一個處理的結點 TreeNode prev = null; // 指向當前處理的結點 TreeNode curr; // 根結點入棧 deque.addLast(root); // 棧非空 while (!deque.isEmpty()) { // 擷取棧頂元素(不刪除) curr = deque.getLast(); if ((curr.left == null && curr.right == null) // 當前元素無左右子樹 // prev != null && curr.left == prev,當前結點只有左子樹,並且左子樹已經遍曆完 // prev != null && curr.right == prev,當前結點有左右子樹,並且左右子樹已經遍曆完 || (prev != null && (curr.left == prev || curr.right == prev))) { // 刪除棧頂元素 curr = deque.removeLast(); // 結點值入棧 list.add(curr.val); // 更新上一個處理的結點 prev = curr; } else { // 左右子樹未遍曆完,將非空左右子樹入棧 if (curr.right != null) { deque.addLast(curr.right); } if (curr.left != null) { deque.addLast(curr.left); } } } } return list; }}
評測結果
點擊圖片,滑鼠不釋放,拖動一段位置,釋放後在新的視窗中查看完整圖片。
第一種方法結果:
第一種方法結果:
特別說明
歡迎轉載,轉載請註明出處【http://blog.csdn.net/derrantcm/article/details/47774647】
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
【LeetCode-面試演算法經典-Java實現】【145-Binary Tree Postorder Traversal(二叉樹非遞迴後序遍曆)】