力扣热题100之第94题
方法一、递归法:
首先我们得知道什么是二叉树的中序遍历:左子树节点 - 根节点 - 右子树节点。就是遇到节点时,优先遍历该节点的左子树,等遍历完了再到根节点,最后是右子树。如下图所示:
那么这棵二叉树中序遍历的结果就为:4 2 8 6 5 7 1 3;
通过这个思路,我们就可以明白,当我们需要中序遍历一颗整树的时候,就得先遍历它的左子树,而遍历它的左子树,需要先遍历它的左子树的左子树,等等。所以我们就可以用递归来解决这个问题。具体代码为:
class Solution {
List<Integer> answer = new ArrayList<>();
public List<Integer> inorderTraversal(TreeNode root) {
inorder(root);
return answer;
}
public void inorder(TreeNode root){
if(root == null){
return;
}
inorder(root.left);
answer.add(root.val);
inorder(root.right);
}
}
方法二、迭代法:
使用迭代法时,因为不能递归,所以在遍历节点时,需要将每个遍历过的节点存储起来,这里我们使用栈来辅助做题。具体代码为:
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> answer = new ArrayList<>();
Stack<TreeNode> stack = new Stack<>();
TreeNode cur = root;
while(cur != null || !stack.isEmpty()){
while(cur != null){
stack.push(cur);
cur = cur.left;
}
TreeNode ret = stack.pop();
answer.add(ret.val);
cur = ret.right;
}
return answer;
}
}