【每日一題】二叉樹的前中後序非遞迴整理
本文整理並介紹二叉樹的三種遍歷所使用的資料結構和遍歷方式。
一、前序遍歷
題目描述:給定一個二叉樹,返回它的 前序 遍歷。
遞迴很簡單,要求用非遞迴實現。
思路: 棧,遍歷時先存放右節點,再存放左節點,能夠保證遍歷到的是前序序列。
public List<Integer> preorderTraversal(TreeNode root) {
LinkedList<TreeNode> stack = new LinkedList<>();
List<Integer> list = new ArrayList<>();
if(root == null)
return list;
stack.addLast(root);
while(!stack.isEmpty()){
TreeNode temp = stack.removeLast();
list.add(temp.val);
if(temp.right != null){ //棧中先存放右節點
stack.addLast(temp.right);
}
if(temp.left != null){ //再存放左節點
stack.addLast(temp.left);
}
}
return list;
}
二、中序遍歷
題目描述:給定一個二叉樹,返回它的中序 遍歷。
遞迴演算法很簡單,你可以通過迭代演算法完成嗎?
思路:棧,依次遍歷左節點存放到棧中,然後當前節點非空時彈棧,再遍歷右節點。
//中序遍歷:左根右
public List<Integer> inorderTraversal(TreeNode root){
Stack<TreeNode> stack = new Stack<>();
List<Integer> list = new ArrayList<>();
TreeNode cur = root;
//迴圈結束的標記為cur為空,並且棧為空
while(cur != null || !stack.isEmpty()){
while(cur != null){
stack.add(cur);
cur = cur.left; //先遍歷左節點
}
TreeNode temp = stack.pop();//再操作根節點
list.add(temp.val);
cur = temp.right;//再遍歷右節點
}
return list;
}
三、後序遍歷
題目描述:給定一個二叉樹,返回它的後序 遍歷。
遞迴演算法很簡單,你可以通過迭代演算法完成嗎?
思路: 棧+雙向連結串列(逆向插入)
非遞迴:棧中先入左節點,後入右節點,彈出時先彈右節點;插入連結串列後要倒序一遍,可以直接每次都插在最前面
左右根的後序遍歷,採用逆向思維,每次存放都存在最左邊
每從棧中彈一個就存到list的最前邊
先存根節點,然後左節點入棧,再右節點入棧,彈出時先彈右節點
/**
* 非遞迴:棧中先入左節點,後入右節點,彈出時先彈右節點;插入連結串列後要倒序一遍,可以直接每次都插在最前面
* 左右根的後序輸出,採用逆向思維,存放時順序為根右左,只不過每次存放都存在最左邊
* 每從棧中彈一個就存到list的最前邊
* 先存根節點,然後左節點入棧,再右節點入棧,彈出時先彈右節點
*
*/
public List<Integer> postorderTraversal(TreeNode root) {
LinkedList<TreeNode> stack = new LinkedList<TreeNode>();
//結果集採用雙向連結串列,在存放值的時候存放在最左邊
LinkedList<Integer> output = new LinkedList<>();
if(root == null)
return output;
stack.push(root);
while(!stack.isEmpty()){
TreeNode temp = stack.pop();
output.addFirst(temp.val); //存值到最前邊,不用倒序翻轉了
if(temp.left != null)
stack.push(temp.left);
if(temp.right != null)
stack.push(temp.right);
}
return output;
}
相關文章
- 二叉樹的前中後序遍歷(遞迴和非遞迴版本)二叉樹遞迴
- 二叉樹——後序遍歷的遞迴與非遞迴演算法二叉樹遞迴演算法
- 非遞迴先序遍歷二叉樹遞迴二叉樹
- 二叉樹的前序、中序、後序的遞迴和迭代實現二叉樹遞迴
- 刷題系列 - Python用非遞迴實現二叉樹中序遍歷Python遞迴二叉樹
- 遍歷二叉樹-------遞迴&非遞迴二叉樹遞迴
- [資料結構]二叉樹的前中後序遍歷(遞迴+迭代實現)資料結構二叉樹遞迴
- 資料結構初階--二叉樹(前中後序遍歷遞迴+非遞迴實現+相關求算結點實現)資料結構二叉樹遞迴
- PHP基於非遞迴演算法實現先序、中序及後序遍歷二叉樹操作示例PHP遞迴演算法二叉樹
- 二叉樹的前中後序遍歷二叉樹
- 【C++】翻轉二叉樹(遞迴、非遞迴)C++二叉樹遞迴
- 遞迴和迭代實現二叉樹先序、中序、後序和層序遍歷遞迴二叉樹
- 二叉樹的四種遍歷(遞迴與非遞迴)二叉樹遞迴
- 二叉樹迭代器(中序遞迴、前序和後序遍歷)演算法二叉樹遞迴演算法
- 刷題系列 - Python用非遞迴實現二叉樹後續遍歷Python遞迴二叉樹
- 二叉樹:前中後序迭代方式統一寫法二叉樹
- 二叉樹的非遞迴遍歷寫法二叉樹遞迴
- 遍歷二叉樹的遞迴與非遞迴程式碼實現二叉樹遞迴
- 什麼是遍歷二叉樹,JavaScript實現二叉樹的遍歷(遞迴,非遞迴)二叉樹JavaScript遞迴
- 樹3-二叉樹非遞迴遍歷(棧)二叉樹遞迴
- 二叉樹的所有遍歷非遞迴實現二叉樹遞迴
- python-二叉樹:前、中、後、層序遍歷Python二叉樹
- python實現二叉樹及其七種遍歷方式(遞迴+非遞迴)Python二叉樹遞迴
- 二叉樹 ---- 前序 中序 後序 知二求一二叉樹
- 【演算法】二叉樹、N叉樹先序、中序、後序、BFS、DFS遍歷的遞迴和迭代實現記錄(Java版)演算法二叉樹遞迴Java
- 刷題系列 - Python用非遞迴實現二叉樹前序遍歷Python遞迴二叉樹
- 二叉樹的遞迴套路二叉樹遞迴
- 已知二叉樹的先序和後序求任意一中序二叉樹
- Java中用遞迴和迭代實現二叉樹的中序( InOrder )遍歷Java遞迴二叉樹
- 還原二叉樹(先序+中序-〉後序)二叉樹
- 二叉樹建立後,如何使用遞迴和棧遍歷二叉樹?二叉樹遞迴
- 【根據前序和中序遍歷構造二叉樹】棧+迭代 || 遞迴二叉樹遞迴
- 二叉樹的先中後序遍歷二叉樹
- 二叉樹的先,中,後序遍歷二叉樹
- 非遞迴實現先序遍歷和中序遍歷遞迴
- 二叉樹的前序、中序、後序三種遍歷二叉樹
- 利用非遞迴演算法來搜尋二叉樹中的某個元素java遞迴演算法二叉樹Java
- Leetcode 題解系列 -- 對稱二叉樹(遞迴)LeetCode二叉樹遞迴