题目描述:
给定一个二叉树的根节点 root ,返回它的 中序 遍历。
示例 1:
输入:root = [1,null,2,3]
输出:[1,3,2]
示例 2:
输入:root = []
输出:[]
示例 3:
输入:root = [1]
输出:[1]
示例 4:
输入:root = [1,2]
输出:[2,1]
示例 5:
输入:root = [1,null,2]
输出:[1,2]
提示:
树中节点数目在范围 [0, 100] 内
-100 <= Node.val <= 100
代码:
public class LC94 {
//中序遍历:左根右
//迭代
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> ansList = new ArrayList<>();
//我们用一个栈来存取寻找“最左节点”时,路过的中间节点
//中序遍历输出的时候,刚好符合我们栈的特点,后进先出
Stack<TreeNode> stack = new Stack<>();
//如果当前节点不是叶子节点或者栈中有元素我们就进行操作
while (root != null || !stack.isEmpty()){
//该节点不是叶子节点,我们就让其入栈,并将其变为它的左节点
while (root != null){
stack.add(root);
root = root.left;
}
//如果该节点为空,我们就将栈顶元素出栈,这说明栈顶元素没有左节点了
//根据中序遍历的特点,我们将该栈顶元素的值添加到list中
root = stack.pop();
ansList.add(root.val);
//最后遍历其右孩子,注意这里的右孩子可能还存在左孩子,所以我们重新开始上述的循环
root = root.right;
}
return ansList;
}
//递归,建议使用该方式,简单易懂
public List<Integer> inorderTraversal1(TreeNode root) {
List<Integer> ansList = new ArrayList<>();
addNode(root, ansList);
return ansList;
}
private void addNode(TreeNode root, List<Integer> ansList) {
//到达叶子节点的下面不存在的节点,结束递归
if (root == null){
return;
}
//左
addNode(root.left, ansList);
//根
ansList.add(root.val);
//右
addNode(root.right, ansList);
}
}

本文介绍了一种实现二叉树中序遍历的方法,包括递归和迭代两种方式。递归方式简洁明了,而迭代方式通过使用栈结构实现了非递归的中序遍历。
307

被折叠的 条评论
为什么被折叠?



