Skip to content

Commit b7379a3

Browse files
committed
二叉树中后序遍历,哈希表标记解法
1 parent 4da688e commit b7379a3

File tree

2 files changed

+80
-0
lines changed

2 files changed

+80
-0
lines changed

leetcode_Java/Solution0094.java

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,4 +184,44 @@ public List<Integer> inorderTraversal(TreeNode root) {
184184
}
185185
return resList;
186186
}
187+
}
188+
189+
190+
/*
191+
* 迭代思路:
192+
* 1、定义数据结构:列表存放节点值;栈按序存放节点;哈希表标记节点是否已处理过左右节点
193+
* 2、数据结构初始化:根节点入栈
194+
* 3、迭代逻辑:
195+
* 1)栈不为空时遍历栈,弹出栈顶节点
196+
* 2)判断当前节点是否已经处理过左右节点,处理过节点值存入列表
197+
* 3)没有则将节点按右中左顺序入栈,弹出时才会是左中右,标记当前节点已处理
198+
* 4、标记目的:节点已经遍历过,但又暂时不能存入列表,所以需要先按序暂存在栈中,按序弹出再存入列表
199+
* 作用与递归相同,递归是使用栈帧保存当前变量,当下一层处理完成后,就可以回到当前栈帧的状态,处理当前的数据
200+
* */
201+
class Solution {
202+
public List<Integer> inorderTraversal(TreeNode root) {
203+
List<Integer> resList = new ArrayList<>();
204+
if (root == null) {
205+
return resList;
206+
}
207+
Map<TreeNode, Boolean> flagMap = new HashMap<>();
208+
Stack<TreeNode> stack = new Stack<>();
209+
stack.add(root);
210+
while (!stack.isEmpty()) {
211+
root = stack.pop();
212+
if (flagMap.getOrDefault(root, false)) {
213+
resList.add(root.val);
214+
} else {
215+
if (root.right != null) {
216+
stack.push(root.right);
217+
}
218+
stack.push(root);
219+
if (root.left != null) {
220+
stack.push(root.left);
221+
}
222+
flagMap.put(root, true);
223+
}
224+
}
225+
return resList;
226+
}
187227
}

leetcode_Java/Solution0145.java

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,4 +127,44 @@ public List<Integer> postorderTraversal(TreeNode root) {
127127
}
128128
return resList;
129129
}
130+
}
131+
132+
133+
/*
134+
* 迭代思路:
135+
* 1、定义数据结构:列表存放节点值;栈按序存放节点;哈希表标记节点是否已处理过左右节点
136+
* 2、数据结构初始化:根节点入栈
137+
* 3、迭代逻辑:
138+
* 1)栈不为空时遍历栈,弹出栈顶节点
139+
* 2)判断当前节点是否已经处理过左右节点,处理过则节点值存入列表
140+
* 3)没有则将节点按中右左顺序入栈,弹出时才会是左右中,标记当前节点已处理
141+
* 4、标记目的:节点已经遍历过,但又暂时不能存入列表,所以需要先按序暂存在栈中,按序弹出再存入列表
142+
* 作用与递归相同,递归是使用栈帧保存当前变量,当下一层处理完成后,就可以回到当前栈帧的状态,处理当前的数据
143+
* */
144+
class Solution {
145+
public List<Integer> postorderTraversal(TreeNode root) {
146+
List<Integer> resList = new ArrayList<>();
147+
if (root == null) {
148+
return resList;
149+
}
150+
Map<TreeNode, Boolean> flagMap = new HashMap<>();
151+
Stack<TreeNode> stack = new Stack<>();
152+
stack.add(root);
153+
while (!stack.isEmpty()) {
154+
root = stack.pop();
155+
if (flagMap.getOrDefault(root, false)) {
156+
resList.add(root.val);
157+
} else {
158+
stack.push(root);
159+
if (root.right != null) {
160+
stack.push(root.right);
161+
}
162+
if (root.left != null) {
163+
stack.push(root.left);
164+
}
165+
flagMap.put(root, true);
166+
}
167+
}
168+
return resList;
169+
}
130170
}

0 commit comments

Comments
 (0)