1. Binary Tree Inorder Traversal
public class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> ans = new ArrayList<>();
if(root == null) return ans;
inorder(root, ans);
return ans;
}
public void inorder(TreeNode root, List<Integer> ans) {
if(root == null)
return;
inorder(root.left, ans);
ans.add(root.val);
inorder(root.right, ans);
}
}
public class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> ans = new ArrayList<>();
if(root == null) return ans;
Stack<TreeNode> st = new Stack<>();
TreeNode cur = root;
while(cur!=null || !st.isEmpty()){
while(cur != null){
st.push(cur);
cur = cur.left;
}
cur = st.pop();
ans.add(cur.val);
cur = cur.right;
}
return ans;
}
}
2. Binary Tree Preorder Traversal
public class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> ans = new ArrayList<>();
preorder(root, ans);
return ans;
}
public void preorder(TreeNode root, List<Integer> ans) {
if(root == null)
return;
ans.add(root.val);
preorder(root.left, ans);
preorder(root.right, ans);
}
}
public class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> ans = new ArrayList<>();
if(root == null) return ans;
Stack<TreeNode> st = new Stack<>();
st.push(root);
while(!st.isEmpty()){
TreeNode node = st.pop();
ans.add(node.val);
if(node.right != null) st.push(node.right);
if(node.left != null) st.push(node.left);
}
return ans;
}
}
3. Binary Tree Postorder Traversal
public class Solution {
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> ans = new ArrayList<>();
postorder(root, ans);
return ans;
}
public void postorder(TreeNode root, List<Integer> ans) {
if(root == null)
return;
postorder(root.left, ans);
postorder(root.right,ans);
ans.add(root.val);
}
}
public class Solution {
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> ans = new ArrayList<>();
if(root == null) return ans;
Stack<TreeNode> st = new Stack<>();
TreeNode cur = root;
while(cur != null || !st.isEmpty()){
while(cur != null){
st.push(cur);
if(cur.left != null)
cur = cur.left;
else
cur = cur.right;
}
cur = st.pop();
ans.add(cur.val);
if(!st.isEmpty() && st.peek().left == cur)
cur = st.peek().right;
else
cur = null;
}
return ans;
}
}
4. Binary Tree Zigzag Level Order Traversal
Given a binary tree, return thezigzag level ordertraversal of its nodes' values. (ie, from left to right, then right to left for the next level and alternate between).
For example:
Given binary tree[3,9,20,null,null,15,7]
,
3
/ \
9 20
/ \
15 7
return its zigzag level order traversal as:
[
[3],
[20,9],
[15,7]
]
public class Solution {
public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
ArrayList<List<Integer>> ans = new ArrayList<>();
if(root == null) return ans;
Queue<TreeNode> q = new LinkedList<>();
q.offer(root);
boolean flag = true;
while(!q.isEmpty()){
List<Integer> sub = new ArrayList<>();
int size = q.size();
for(int i = 0; i < size; i ++){
TreeNode node = q.poll();
if(node.left != null) q.offer(node.left);
if(node.right!= null) q.offer(node.right);
if(flag)
sub.add(node.val);
else
sub.add(0, node.val);
}
flag = !flag;
ans.add(sub);
}
return ans;
}
}
5. Binary Tree Level Order Traversal II
Given a binary tree, return thebottom-up level ordertraversal of its nodes' values. (ie, from left to right, level by level from leaf to root).
For example:
Given binary tree[3,9,20,null,null,15,7]
,
3
/ \
9 20
/ \
15 7
return its bottom-up level order traversal as:
[
[15,7],
[9,20],
[3]
]
public class Solution {
public List<List<Integer>> levelOrderBottom(TreeNode root) {
ArrayList<List<Integer>> ans = new ArrayList<>();
if(root == null) return ans;
Queue<TreeNode> q = new LinkedList<>();
q.offer(root);
while(!q.isEmpty()){
int size = q.size();
List<Integer> sub = new ArrayList<>();
for(int i = 0; i < size; i ++){
TreeNode node = q.poll();
if(node.left != null) q.offer(node.left);
if(node.right!= null) q.offer(node.right);
sub.add(node.val);
}
ans.add(0, sub);
}
return ans;
}
}
6. Flatten Binary Tree to Linked List
Given a binary tree, flatten it to a linked list in-place.
For example,
Given
1
/ \
2 5
/ \ \
3 4 6
The flattened tree should look like:
1
\
2
\
3
\
4
\
5
\
6
public class Solution {
TreeNode start = new TreeNode(0);
TreeNode pre = start;
public void flatten(TreeNode root) {
if(root == null) return;
preOrder(root);
root = start.right;
}
public void preOrder(TreeNode root) {
if(root == null)
return;
TreeNode left_tree = root.left;
TreeNode right_tree= root.right;
root.left = null;
root.right= null;
pre.right = root;
pre = root;
preOrder(left_tree);
preOrder(right_tree);
}
}