题目:中序遍历二叉树
解析:
1.递归遍历
public List<Integer> inorderTraversal1(TreeNode root) {
List<Integer> list = new ArrayList<Integer>();
if (root == null) return list;
inOrder1(root,list);
return list;
}
public void inOrder1(TreeNode root,List<Integer> list){
if (root!= null){
inOrder1(root.left,list);
list.add(root.val);
inOrder1(root.right,list);
}
}
2.非递归遍历
①从根节点1开始将左子树压入栈(右边为栈顶)中,即1 2 4 8;
②栈中弹出结点8,将其存入list中,判断结点8是否有右孩子,如果有则将右孩子压入栈中。没有不做操作。此时栈中数据为 1 2 4,list中数据为8;
③栈中弹出结点4,将其存入list中,判断结点4是否有右孩子,如果有则将右孩子9压入栈中。此时栈中数据为1 2 9,list中数据为8 4;
…
========>规律为:从第二步开始循环操作,直到栈中的数据为空。
public List<Integer> inorderTraversal2(TreeNode root) {
List<Integer> list = new ArrayList<Integer>();
if (root == null) return list;
Stack<TreeNode> stack = new Stack<TreeNode>();
while (root!= null||!stack.isEmpty()){
while(root!= null){
stack.push(root);//先将根节点压入栈
root = root.left;//循环将左孩子节点压入栈
}
TreeNode node = stack.pop();//栈顶元素是底层的左节点,取出左节点
list.add(node.val);//访问左节点
root = node.right;//如果结点有右孩子,则压入栈(是否有右孩子其实在下次循环中判断)
}
return list;
}