Given a binary tree, return its mid-order traversal.
Example:
Input: [1,null,2,3]
Output: [1,3,2]
Solution (1): It is very simple to use DFS deep search recursive algorithm for middle order traversal
class Solution {
private final List<Integer>res=new ArrayList<>();
public List<Integer> inorderTraversal(TreeNode root) {
DFS(res,root);
return res;
}
private void DFS(List<Integer>res,TreeNode node){
if(node==null)
return;
DFS(res,node.left);
res.add(node.val);
DFS(res,node.right);
}
}
Solution (2): If DFS recursion is not used, we can use the stack to implement the algorithm
import java.util.*;
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer>res=new Vector<>();
TreeNode node = root;
Stack<TreeNode> DFS = new Stack<>();
while (!DFS.isEmpty() || node != null) {
while (node != null) {
DFS.push(node);
node = node.left;
}
node = DFS.pop();
res.add(node.val);
node=node.right;
}
return res;
}
}
Problem solution (3): Morris algorithm , Morris algorithm does not need to be implemented recursively, nor does it need to use a stack, which optimizes the space complexity to O(1).
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer>res=new ArrayList<>();
//Morris算法
TreeNode node=root;
TreeNode backTrace=null;
while(node!=null){
if(node.left!=null){
backTrace=node.left;
while(backTrace.right!=null&&backTrace.right!=node)
backTrace=backTrace.right;
if(backTrace.right==null){
backTrace.right=node;
node=node.left;
}
else{
backTrace.right=null;
res.add(node.val);
node=node.right;
}
}
else{
res.add(node.val);
node=node.right;
}
}
return res;
}
}