【Java資料結構與演算法筆記(二)】樹的四種遍歷方式(遞迴&非遞迴)
這也是暑期實習的準備之一,最近進入了演算法題的整理階段,感覺提升了很多,後期還會更新的。
這個只含有程式碼和必要的解釋,如果你看不懂的話,建議先把資料結構課本看一下~
後序遍歷(⚠️非遞迴的trick)
遞迴版
import java.util.*;
public class Solution {
ArrayList<Integer> res = new ArrayList<Integer>();
public ArrayList<Integer> postorderTraversal(TreeNode root) {
if(root!=null){
postorderTraversal(root.left);
postorderTraversal(root.right);
res.add(root.val);
}
return res;
}
}
利用棧
由於先序遍歷的順序是(根,左,右),後序遍歷的順序是(左,右,根),我們可以考慮這樣一種方法:將先序遍歷改為(根,右,左),然後在將其逆置即可,逆置我們採取的方法是 add(0,num)
,即可實現逆置。
import java.util.*;
public class Solution {
ArrayList<Integer> res = new ArrayList<Integer>();
public ArrayList<Integer> postorderTraversal(TreeNode root) {
if(root==null)
return res;
Stack<TreeNode> stack = new Stack<TreeNode>();
stack.push(root);
while(!stack.isEmpty()){
TreeNode tmp = stack.pop();
res.add(0,tmp.val);
if(tmp.left!=null)
stack.push(tmp.left);
if(tmp.right!=null)
stack.push(tmp.right);
}
return res;
}
}
先序遍歷
遞迴
import java.util.*;
public class Solution {
ArrayList<Integer> res = new ArrayList<Integer>();
public ArrayList<Integer> preorderTraversal(TreeNode root) {
if(root!=null){
res.add(root.val);
preorderTraversal(root.left);
preorderTraversal(root.right);
}
return res;
}
}
藉助棧實現非遞迴寫法
import java.util.*;
public class Solution {
public ArrayList<Integer> preorderTraversal(TreeNode root) {
ArrayList<Integer> res = new ArrayList<Integer>();
if(root==null)
return res;
Stack<TreeNode> stack = new Stack<TreeNode>();
stack.push(root);
while(!stack.isEmpty()){
TreeNode tmp = stack.pop();
res.add(tmp.val);
if(tmp.right!=null)
stack.push(tmp.right);
if(tmp.left!=null)
stack.push(tmp.left);
}
return res;
}
}
中序遍歷
遞迴
import java.util.*;
public class Solution {
ArrayList<Integer> res = new ArrayList<Integer>();
public ArrayList<Integer> inorderTraversal(TreeNode root) {
if(root!=null){
inorderTraversal(root.left);
res.add(root.val);
inorderTraversal(root.right);
}
return res;
}
}
使用棧
import java.util.*;
public class Solution {
ArrayList<Integer> res = new ArrayList<Integer>();
public ArrayList<Integer> inorderTraversal(TreeNode root) {
Stack<TreeNode> stack = new Stack<TreeNode>();
TreeNode node = root;
while(node!=null){
stack.push(node);
node = node.left;
}
while(!stack.isEmpty()){
TreeNode tmp = stack.pop();
res.add(tmp.val);
if(tmp.right!=null){
TreeNode n = tmp.right;
while(n!=null){
stack.push(n);
n = n.left;
}
}
}
return res;
}
}
層次遍歷
import java.util.ArrayList;
import java.util.LinkedList;
public class Solution {
public ArrayList<Integer> PrintFromTopToBottom(TreeNode root) {
ArrayList<Integer> res = new ArrayList<Integer>();
if(root==null) return res;
LinkedList<TreeNode> queue = new LinkedList<TreeNode>();
queue.add(root);
while(!queue.isEmpty()) {
TreeNode node = queue.poll();
res.add(node.val);
if(node.left!=null) queue.add(node.left);
if(node.right!=null) queue.add(node.right);
}
return res;
}
}
相關文章
- 二叉樹的四種遍歷(遞迴與非遞迴)二叉樹遞迴
- 【資料結構】二叉樹遍歷(遞迴+非遞迴)資料結構二叉樹遞迴
- 遍歷二叉樹-------遞迴&非遞迴二叉樹遞迴
- 二叉樹——後序遍歷的遞迴與非遞迴演算法二叉樹遞迴演算法
- Java遍歷資料夾的兩種方法(非遞迴和遞迴)Java遞迴
- [java] 二叉樹的後序遍歷(遞迴與非遞迴實現)Java二叉樹遞迴
- python實現二叉樹及其七種遍歷方式(遞迴+非遞迴)Python二叉樹遞迴
- 二叉樹非遞迴遍歷二叉樹遞迴
- 二叉樹建立及遍歷演算法(遞迴及非遞迴)二叉樹演算法遞迴
- 遍歷二叉樹的遞迴與非遞迴程式碼實現二叉樹遞迴
- 二叉樹的非遞迴遍歷——java實現二叉樹遞迴Java
- 什麼是遍歷二叉樹,JavaScript實現二叉樹的遍歷(遞迴,非遞迴)二叉樹JavaScript遞迴
- 非遞迴先序遍歷二叉樹遞迴二叉樹
- 【刷題】二叉樹非遞迴遍歷二叉樹遞迴
- 二叉樹的非遞迴遍歷寫法二叉樹遞迴
- 二叉樹的前中後序遍歷(遞迴和非遞迴版本)二叉樹遞迴
- 資料結構-樹以及深度、廣度優先遍歷(遞迴和非遞迴,python實現)資料結構遞迴Python
- 樹3-二叉樹非遞迴遍歷(棧)二叉樹遞迴
- 二叉樹的所有遍歷非遞迴實現二叉樹遞迴
- Java 資料夾遞迴遍歷Java遞迴
- 資料結構初階--二叉樹(前中後序遍歷遞迴+非遞迴實現+相關求算結點實現)資料結構二叉樹遞迴
- 樹(2)--二叉樹的遍歷(非遞迴)+線索二叉樹二叉樹遞迴
- 遞迴遍歷樹狀結構優雅實現遞迴
- 【資料結構】——搜尋二叉樹的插入,查詢和刪除(遞迴&非遞迴)資料結構二叉樹遞迴
- 二叉樹的建立與遍歷(遞迴實現)二叉樹遞迴
- [資料結構]二叉樹的前中後序遍歷(遞迴+迭代實現)資料結構二叉樹遞迴
- 二叉樹的遍歷 → 不用遞迴,還能遍歷嗎二叉樹遞迴
- 非遞迴遍歷二叉樹的四種策略-先序、中序、後序和層序遞迴二叉樹
- PHP遞迴遍歷資料夾PHP遞迴
- 遍歷二叉樹的迭代和遞迴方法二叉樹遞迴
- 資料結構與演算法:遞迴資料結構演算法遞迴
- 關於樹型結構資料遞迴查詢,轉非遞迴查詢的實現遞迴
- 【C++】翻轉二叉樹(遞迴、非遞迴)C++二叉樹遞迴
- Java資料結構與演算法--遞迴和回溯Java資料結構演算法遞迴
- Android遍歷所有控制元件的遞迴和非遞迴實現Android控制元件遞迴
- 資料結構之二叉樹遞迴操作資料結構二叉樹遞迴
- 資料結構與演算法——歸併排序: 陣列&連結串列&遞迴&非遞迴解法全家桶資料結構演算法排序陣列遞迴
- Day14 | 二叉樹遞迴遍歷二叉樹遞迴