leetcode–demo94二叉树的中序遍历
解决这题我们首先要知道什么是中序遍历,简而言之就是按照访问左子树——根节点——右子树的方式遍历这棵树,而在访问左子树或者右子树的时候我们按照同样的方式遍历,直到遍历完整棵树。处理这种问题一般我们采用两种解决方法:一种递归,一种使用栈。
第一种:递归
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode() {
}
TreeNode(int val) {
this.val = val;
}
TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
}
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
if (root == null) {
return res;
}
//如果不为空则进行中序遍历
inorder(root, res);
return res;
}
private void inorder(TreeNode root, List<Integer> res) {
if (root == null) {
return;
}
//先遍历左边
inorder(root.left,res);
//遍历不下去return时,记录结点的值
res.add(root.val);
//然后是右边
inorder(root.right,res);
}
}
第二种:使用栈
对于入栈出栈顺序不清楚的,去官网查看动图。
class Solution1 {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> res=new ArrayList<>();
Stack<TreeNode> stack = new Stack<>();
while (root!=null||!stack.isEmpty()){
while (root!=null){
stack.push(root);
root=root.left;
}
//此时while循环结束root为空,无法在向左边遍历
root=stack.pop();//将栈中顶层元素弹出,此时root相当于移回当前空节点的父节点
res.add(root.val);
//向右遍历
if (root.right!=null){
root=root.right;
}
}
return res;
}
}