Leetcode——94. 二叉树的中序遍历(递归与非递归)
@
94. 二叉树的中序遍历
https://leetcode-cn.com/problems/binary-tree-inorder-traversal/submissions/
题目
给定一个二叉树,返回它的中序 遍历。
示例:
输入: [1,null,2,3]
1
\
2
/
3
输出: [1,3,2]
进阶: 递归算法很简单,你可以通过迭代算法完成吗?
1、简单递归中序遍历
思想
用递归中序遍历即可,将遍历序列存入集合返回即可
代码
/*
1、递归形式
*/
class Solution {
public void inTr(TreeNode root, List<Integer> result) {
if(root == null){
return;
}
inTr(root.left, result);
result.add(root.val);
inTr(root.right, result);
}
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
inTr(root, res);
return res;
}
}
2、中序非递归遍历
思想
用栈存储遍历的结点,首先向左遍历到树中最左端的叶子结点,然后将该叶子结点弹出加入结果集合;然后访问该结点的右孩子。递归该过程直至栈为空且当前遍历结点为空即可
代码
/*
2、中序非递归
*/
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
Stack<TreeNode> s = new Stack<>();
if(root == null){
return res;
}
TreeNode cur = root;
while(!s.isEmpty() || cur != null){//循环条件,满足一条还需继续
while(cur != null){//未访问到叶结点,则加入栈并更新当前访问结点
s.push(cur);
cur = cur.left;
}
//访问到叶结点,则弹出当前栈顶结点,然后将该结点值加入结果集合并更新当前访问结点
cur = s.pop();
res.add(cur.val);
cur = cur.right;
}
return res;
}
}

浙公网安备 33010602011771号