目录
1 题目描述
2 解题思路
递归和非递归底层实现都是栈。
- 对于递归:先一直向左遍历,直到为空时返回并且打印最左的左孩子,然后再判断该元素是否有右孩子,此时的元素再递归判断左孩子~~~和之前情形一致。
- 对于非递归:将所有的左孩子都入栈,定义一个top指向栈顶元素,当遍历cur到null时,可以将cur指向新的top,这样下来再遍历top.right,直到遍历完二叉树为止。
3 递归代码实现
void binaryTreeInOrder(TreeNode root) {
if (root == null){
return;
}
binaryTreeInOrder(root.left);
System.out.print(root.value+" ");
binaryTreeInOrder(root.right);
}
4 非递归代码实现
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> list = new ArrayList<>();
//用栈实现
Stack<TreeNode> stack = new Stack<>();
TreeNode cur = root;
TreeNode top = null;
while (cur != null || !stack.isEmpty()){
//内层循环将当前数据入栈
while (cur != null){
stack.push(cur);
cur = cur.left;
}
//出栈并将该元素放入到链表中
top = stack.pop();
list.add(top.val);
//将cur指向栈顶元素的右孩子
cur = top.right;
}
return list;
}
}