题目描述
给定一个二叉树的根节点 root ,返回它的 中序 遍历。
- 首先是递归方法。
访问顺序:先左子树,再根节点,最后右子树;
原理:要先观察最后一个,从后往前进行分析。
随后进入D的右节点,运行inorder(res,root.right);D的右节点为空,函数返回。
到这里当然没结束,会依次返回到B点E点,回到A点。
此时,A的左侧节点已经加入完了,接下来是A的右侧节点。
代码如下
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<Integer>();
inorder(res,root);
return res;
}
public void inorder(List<Integer> res,TreeNode root){
if(root==null){
return;
}
else{
inorder(res,root.left);
res.add(root.val);
inorder(res,root.right);
}
}
}
迭代
原理:先设置一个总循环确保所有的节点都入栈,再设置一个循环确保每次都能把左节点先入栈。随后把这个左节点出栈来表示这个节点已经中序排序结束,一级一级出栈,然后才轮到右侧节点。
代码
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<Integer>();
Stack<TreeNode> sta = new Stack<TreeNode>();
while(root!=null || !sta.isEmpty()){
while(root!=null){
sta.add(root);
root = root.left;
}
root = sta.pop();
res.add(root.val);
root = root.right;
}
return res;
}
}