1. 程式人生 > >二叉樹後序遍歷--遞歸與非遞歸實現

二叉樹後序遍歷--遞歸與非遞歸實現

eno oid imp array ins hashmap nod package 實現

package tree;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Stack;

/**
 * 給定一個二叉樹,返回它的 後序 遍歷。

 示例:

 輸入: [1,null,2,3]
 1
  2
 /
 3

 輸出: [3,2,1]

 進階: 遞歸算法很簡單,你可以通過叠代算法完成嗎?

 */
public class p145 {
    List<Integer> result=new ArrayList<>();

    
public List<Integer> postorderTraversal(TreeNode root) { if(root==null)return result; //空樹直接返回 //recursive(root); //遞歸 iterative(root); //叠代 return result; } //遞歸解 public void recursive(TreeNode treeNode){ if(treeNode==null)return
; recursive(treeNode.left); recursive(treeNode.right); result.add(treeNode.val); } //叠代 public void iterative(TreeNode root){ TreeNode node=root; Stack<TreeNode> stack=new Stack<>(); HashMap<TreeNode,Boolean> map=new HashMap<>(); stack.push(root);
//根節點入棧 map.put(node,true); while(!stack.empty()) { //當棧不為空時進行叠代 node=stack.peek(); while(node.left!=null||node.right!=null){ //當不為葉子時遍歷,每次查找一條遍歷路徑 if(node.left!=null&&!map.containsKey(node.left)){ //左子樹不空且未被遍歷過時 stack.push(node.left); map.put(node.left,true); node=node.left; continue; } if(node.right!=null&&!map.containsKey(node.right)){ //右子樹不空且未被遍歷過時 stack.push(node.right); map.put(node.right,true); node=node.right; }else{ break; } } node=stack.pop(); //出棧 result.add(node.val); //添加到結果鏈表 } } public static void main(String argv[]){ p145 temp=new p145(); TreeNode root=new TreeNode(1); root.right=new TreeNode(2); root.right.left=new TreeNode(3); for(Integer i:temp.postorderTraversal(root)){ System.out.println(i); } } }

二叉樹後序遍歷--遞歸與非遞歸實現