[java] 二叉樹的後序遍歷(遞迴與非遞迴實現)
後序遍歷遞迴定義: 先左子樹,後右子樹,再根節點。
後序遍歷的難點在於:需要判斷上次訪問的節點是位於左子樹,還是右子樹。
若是位於左子樹,則需跳過根節點,先進入右子樹,再回頭訪問根節點;
若是位於右子樹,則直接訪問根節點。直接看程式碼,程式碼中有詳細的註釋。
public void behindOrder(Tree n){
if(n!= null){
behindOrder(n.left_child);
behindOrder(n.right_child);
System.out.print(n.val+" ");
}
}
/**
* public class Node {
public int data; //樹結點標號
public Node lchild; //左子樹
public Node rchild; //右子樹
}
後序遍歷遞迴定義:先左子樹,後右子樹,再根節點。
後序遍歷的難點在於:需要判斷上次訪問的節點是位於左子樹,還是右子樹。
若是位於左子樹,則需跳過根節點,先進入右子樹,再回頭訪問根節點;
若是位於右子樹,則直接訪問根節點。
*/
public void behindOrder2(Tree node){
if(node==null)
return;
Stack<Tree> s = new Stack<Tree>();
Tree curNode; //當前訪問的結點
Tree lastVisitNode; //上次訪問的結點
curNode = node;
lastVisitNode = node;
//把currentNode移到左子樹的最下邊
while(curNode!=null){
s.push(curNode);
curNode = curNode.left_child;
}
while(!s.empty()){
curNode = s.pop(); //彈出棧頂元素
//一個根節點被訪問的前提是:無右子樹或右子樹已被訪問過
if(curNode.right_child !=null && curNode.right_child != lastVisitNode){
//根節點再次入棧
s.push(curNode);
//進入右子樹,且可肯定右子樹一定不為空
curNode = curNode.right_child;
while(curNode!=null){
//再走到右子樹的最左邊
s.push(curNode);
curNode = curNode.left_child;
}
}else{
//訪問
System.out.print(curNode.val+" " );
//修改最近被訪問的節點
lastVisitNode = curNode;
}
} //while
}
相關文章
- 二叉樹——後序遍歷的遞迴與非遞迴演算法二叉樹遞迴演算法
- 遍歷二叉樹-------遞迴&非遞迴二叉樹遞迴
- 遍歷二叉樹的遞迴與非遞迴程式碼實現二叉樹遞迴
- 二叉樹的前中後序遍歷(遞迴和非遞迴版本)二叉樹遞迴
- 二叉樹的非遞迴遍歷——java實現二叉樹遞迴Java
- 非遞迴先序遍歷二叉樹遞迴二叉樹
- 二叉樹的四種遍歷(遞迴與非遞迴)二叉樹遞迴
- 什麼是遍歷二叉樹,JavaScript實現二叉樹的遍歷(遞迴,非遞迴)二叉樹JavaScript遞迴
- 二叉樹非遞迴遍歷二叉樹遞迴
- 二叉樹的所有遍歷非遞迴實現二叉樹遞迴
- 【資料結構】二叉樹遍歷(遞迴+非遞迴)資料結構二叉樹遞迴
- python實現二叉樹及其七種遍歷方式(遞迴+非遞迴)Python二叉樹遞迴
- 非遞迴實現先序遍歷和中序遍歷遞迴
- 二叉樹的建立與遍歷(遞迴實現)二叉樹遞迴
- 【刷題】二叉樹非遞迴遍歷二叉樹遞迴
- 二叉樹的非遞迴遍歷寫法二叉樹遞迴
- 二叉樹建立及遍歷演算法(遞迴及非遞迴)二叉樹演算法遞迴
- 樹3-二叉樹非遞迴遍歷(棧)二叉樹遞迴
- Java中用遞迴和迭代實現二叉樹的中序( InOrder )遍歷Java遞迴二叉樹
- 遞迴和迭代實現二叉樹先序、中序、後序和層序遍歷遞迴二叉樹
- 刷題系列 - Python用非遞迴實現二叉樹中序遍歷Python遞迴二叉樹
- 非遞迴遍歷二叉樹的四種策略-先序、中序、後序和層序遞迴二叉樹
- 資料結構初階--二叉樹(前中後序遍歷遞迴+非遞迴實現+相關求算結點實現)資料結構二叉樹遞迴
- 刷題系列 - Python用非遞迴實現二叉樹後續遍歷Python遞迴二叉樹
- [資料結構]二叉樹的前中後序遍歷(遞迴+迭代實現)資料結構二叉樹遞迴
- 樹(2)--二叉樹的遍歷(非遞迴)+線索二叉樹二叉樹遞迴
- PHP基於非遞迴演算法實現先序、中序及後序遍歷二叉樹操作示例PHP遞迴演算法二叉樹
- Android遍歷所有控制元件的遞迴和非遞迴實現Android控制元件遞迴
- 刷題系列 - Python用非遞迴實現二叉樹前序遍歷Python遞迴二叉樹
- Java遍歷資料夾的兩種方法(非遞迴和遞迴)Java遞迴
- 二叉樹迭代器(中序遞迴、前序和後序遍歷)演算法二叉樹遞迴演算法
- 二叉樹的遍歷 → 不用遞迴,還能遍歷嗎二叉樹遞迴
- 遍歷二叉樹的迭代和遞迴方法二叉樹遞迴
- 【C++】翻轉二叉樹(遞迴、非遞迴)C++二叉樹遞迴
- 二叉樹的前序、中序、後序的遞迴和迭代實現二叉樹遞迴
- 【Java資料結構與演算法筆記(二)】樹的四種遍歷方式(遞迴&非遞迴)Java資料結構演算法筆記遞迴
- 二叉樹建立後,如何使用遞迴和棧遍歷二叉樹?二叉樹遞迴
- 【演算法】二叉樹、N叉樹先序、中序、後序、BFS、DFS遍歷的遞迴和迭代實現記錄(Java版)演算法二叉樹遞迴Java