leetcode 145+590 二叉樹後序遍歷(iterative)(附589,144,94)
題目描述
145. Binary Tree Postorder Traversal
Given a binary tree, return the postorder traversal of its nodes' values.
Example:
Input:[1,null,2,3]
1 \ 2 / 3 Output:[3,2,1]
class Solution { public List<Integer> postorderTraversal(TreeNode root) { LinkedList<TreeNode> stack = new LinkedList<>(); LinkedList<Integer> output = new LinkedList<>(); if (root == null) { return output; } stack.add(root); while (!stack.isEmpty()) { TreeNode node = stack.pollLast(); output.addFirst(node.val); if (node.left != null) { stack.add(node.left); } if (node.right != null) { stack.add(node.right); } } return output; } }
590. N-ary Tree Postorder Traversal
Given an n-ary tree, return the postorder traversal of its nodes' values.
For example, given a 3-ary
tree:
Return its postorder traversal as: [5,6,3,2,4,1]
.
class Solution { public List<Integer> postorder(Node root) { LinkedList<Node> stack= new LinkedList<>(); LinkedList<Integer> output= new LinkedList<>(); if(root==null) return output; stack.add(root); while(!stack.isEmpty()){ Node tmp= stack.pollLast(); output.addFirst(tmp.val); for(Node n: tmp.children){ if(n!=null) stack.add(n); } } return output; } }
145與590兩道題只有樹節點的構造稍微不同,實現原理都是相同的。要求不用遞迴,迭代做、
下圖是solution解釋中的圖,非原創
通過上圖可發現:
BFS:從上至下,從左至右
DFS:左右根有三種排列方式
144. Binary Tree Preorder Traversal
Given a binary tree, return the preorder traversal of its nodes' values.
Example:
Input:[1,null,2,3]
1 \ 2 / 3 Output:[1,2,3]
class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
LinkedList<TreeNode> stack= new LinkedList<>();
LinkedList<Integer> output= new LinkedList<>();
if(root==null)
return output;
stack.add(root);
while(!stack.isEmpty()){
TreeNode tmp= stack.pollLast();
output.addLast(tmp.val);
if(tmp.right!=null){
stack.addLast(tmp.right);
}
if(tmp.left!=null){
stack.addLast(tmp.left);
}
}
return output;
}
}
589. N-ary Tree Preorder Traversal
Given an n-ary tree, return the preorder traversal of its nodes' values.
For example, given a 3-ary
tree:
Return its preorder traversal as: [1,3,5,6,2,4]
.
class Solution {
public List<Integer> preorder(Node root) {
LinkedList<Node> stack= new LinkedList<>();
LinkedList<Integer> output= new LinkedList<>();
if(root==null)
return output;
stack.add(root);
while(!stack.isEmpty()){
Node tmp= stack.pollLast();
output.addLast(tmp.val);
int index= tmp.children.size()-1;
for(;index>=0;index--){
Node chil= tmp.children.get(index);
if(chil!=null) stack.addLast(chil);
}
}
return output;
}
}
94. Binary Tree Inorder Traversal
Given a binary tree, return the inorder traversal of its nodes' values.
Example:
Input: [1,null,2,3]
1
\
2
/
3
Output: [1,3,2]
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
LinkedList<TreeNode> stack= new LinkedList<>();
LinkedList<Integer> output= new LinkedList<>();
if(root==null)
return output;
stack.add(root);
TreeNode cur= root.left;
while(cur!=null || !stack.isEmpty()){
while(cur!=null){
stack.addLast(cur);
cur= cur.left;
}
cur= stack.pollLast();
output.addLast(cur.val);
cur= cur.right;
}
return output;
}
}