中序遍历二叉树:
遍历顺序:左,根,右
首先遍历左子树,直到遇到第一个没有左子树的节点,输出,然后遍历右子树。递归算法比较简单,和先序遍历差别不大。
public static List<Integer> inorderTraversal(TreeNode root) {
if(root == null) return Collections.EMPTY_LIST;
List<Integer> ls = new ArrayList<Integer>();
ls.addAll(inorderTraversal(root.left));
ls.add(root.val);
ls.addAll(inorderTraversal(root.right));
return ls;
}
非递归实现比先序遍历复杂了一些,同样是使用栈,先序遍历中是遇到节点,先入栈、出栈输出,再遍历其左孩子和右孩子,而中序遍历中,需要先一直遍历其左孩子,入栈,直到没有左孩子时,出栈,输出,然后右孩子入栈。
public static List<Integer> inorderTraversal(TreeNode root) {
List<Integer> list = new ArrayList<Integer>();
if(root == null) return list;
Stack<TreeNode> st = new Stack<TreeNode>();
TreeNode p = root;
while(!st.isEmpty() || p != null){
if(p != null){
st.push(p);
p = p.left;//一直向左遍历,直到没有左孩子
}else{
TreeNode t = st.pop();//没有左孩子,则当前节点时子树根节点,输出
list.add(t.val);
p = t.right;//遍历当前子树右孩子
}
}
return list;
}