網站首頁 編程語言 正文
樹節點的基本結構:
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode() {}
TreeNode(int val) { this.val = val; }
TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
}
1.先序遍歷:
遍歷順序:根-左孩子-右孩子
1.1 遞歸算法:
class Solution {
List res;
public List preorderTraversal(TreeNode root) {
res = new LinkedList();
preTraver(root);
return res;
}
public void preTraver(TreeNode root) {
if(root != null) {
res.add(root.val);
preTraver(root.left);
preTraver(root.right);
}
}
}
1.2 非遞歸算法:
使用棧來做。最外面用root變量來保存左孩子。root不為空,則直接入棧,并記錄下當前值(因為先序遍歷是先遍歷根);如果root為空,說明此時棧頂結點應該遍歷右孩子,則出棧,并遍歷右孩子。
class Solution {
List res;
public List preorderTraversal(TreeNode root) {
Deque stack = new LinkedList();
List res = new ArrayList();
while(root!=null || !stack.isEmpty()) {
if(root != null) {
stack.addFirst(root);
res.add(root.val);
root = root.left;
} else {
TreeNode p = stack.pollFirst();
if(p.right != null) {
root = p.right;
}
}
}
return res;
}
}
2.中序遍歷
遍歷順序:左孩子-根-右孩子
2.1 遞歸算法:
使用棧來做。最外面用root變量來保存左孩子。root不為空,則直接入棧;如果root為空,說明此時棧頂結點應該遍歷右孩子。
class Solution {
List res;
public List inorderTraversal(TreeNode root) {
res = new ArrayList();
inorderTraver(root);
return res;
}
public void inorderTraver(TreeNode root) {
if(root != null) {
inorderTraver(root.left);
res.add(root.val);
inorderTraver(root.right);
}
}
}
2.2 非遞歸算法:
使用棧來做。最外面用root變量來保存左孩子。root不為空,則直接入棧;如果root為空,說明此時棧頂結點應該遍歷右孩子,則出棧,記錄下當前結點的值(因為中序遍歷是先遍歷左孩子,然后才是根),然后遍歷右孩子。
與先序遍歷基本相同,唯一不同的地方在于何時記錄結點值。先序遍歷是入棧的時候記錄結點值,中序遍歷時出棧的時候記錄結點值。
class Solution {
public List inorderTraversal(TreeNode root) {
List res = new ArrayList();
Deque stack = new LinkedList();
while(root!=null || !stack.isEmpty()) {
if(root != null) {
stack.addFirst(root);
root = root.left;
} else {
TreeNode p = stack.poll();
res.add(p.val);
root = p.right;
}
}
return res;
}
}
3. 后序遍歷
遍歷順序:左孩子-右孩子-根
3.1 遞歸算法
class Solution {
List res;
public List postorderTraversal(TreeNode root) {
res = new ArrayList();
posTraver(root);
return res;
}
public void posTraver(TreeNode root) {
if(root != null) {
posTraver(root.left);
posTraver(root.right);
res.add(root.val);
}
}
}
3.2 非遞歸算法
考慮到,先序遍歷是(根-左孩子-右孩子)、后序遍歷是(左孩子-右孩子-根)因此可以再先序遍歷的基礎上進行改進,改成(根-右孩子-左孩子),然后進行逆置操作。對于ArraList可以采用Collections.reverse(res)來進行逆置。
class Solution {
public List postorderTraversal(TreeNode root) {
List res = new ArrayList();
Deque stack = new LinkedList();
while(root != null || !stack.isEmpty()) {
if(root != null) {
stack.addFirst(root);
res.add(root.val);
root = root.right;
} else {
TreeNode p = stack.pollFirst();
root = p.left;
}
}
Collections.reverse(res);
return res;
}
}
4. 層序遍歷
4.1 遞歸算法
記錄下當前結點位于第幾層,先后遍歷左右結點。
class Solution {
List> res;
public List> levelOrder(TreeNode root) {
res = new ArrayList>();
if(root == null) {return res;}
levelTravel(root, 0);
return res;
}
public void levelTravel(TreeNode root, int level) {
if(root == null) {
return ;
}
List temp ;
if(level >= res.size()) {
temp = new ArrayList();
res.add(temp);
} else {
temp = res.get(level);
}
temp.add(root.val);
levelTravel(root.left,level +1);
levelTravel(root.right,level +1);
}
}
4.2? 非遞歸算法
采用隊列來做。
class Solution {
public List> levelOrder(TreeNode root) {
List> res = new ArrayList>();
if(root == null) {return res;}
Deque queue = new LinkedList();
queue.addFirst(root);
int n = 1;
while(!queue.isEmpty()) {
n = queue.size();
List temp = new ArrayList();
for(int i = 1; i <= n; i++) {
TreeNode p = queue.pollLast();
temp.add(p.val);
if(p.left != null) {
queue.addFirst(p.left);
}
if(p.right != null) {
queue.addFirst(p.right);
}
}
res.add(temp);
}
return res;
}
}
原文鏈接:https://blog.csdn.net/xuan971130/article/details/124582306
相關推薦
- 2022-09-22 matplotlib自定義風格
- 2022-07-03 Go?的入口函數和包初始化的使用_Golang
- 2022-07-18 Column count doesn’t match value count at row 1
- 2022-11-23 Qt采用線程以隊列方式實現下發數據_C 語言
- 2023-11-15 【深度學習】YOLOv5斷點訓練——中斷后繼續訓練
- 2022-12-12 C#中TextBox的橫線樣式及占位提示詳解_C#教程
- 2022-04-09 SpringBoot自定義Validated枚舉校驗器
- 2022-04-21 Python的基礎語法和輸入輸出函數你都了解嗎_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支