「这是我参与11月更文挑战的第15天,活动详情查看:2021最后一次更文挑战」
前言
力扣第九十四题 二叉树的中序遍历 如下所示:
给定一个二叉树的根节点 root ,返回它的 中序 遍历。
示例 1:
输入: root = [1,null,2,3]
输出: [1,3,2]
一、思路
这一题就不用过多的介绍了,二叉树的 前中后序 可谓是非常经典的题目了。
我们正好可以利用这一题复习一下二叉树的基础,你还记得什么时 前中后序 遍历二叉树吗?
- 前序遍历:先根节点,再找左孩子,最后找右孩子
- 中序遍历:先找左孩子,再找根节点,最后找右孩子
- 后序遍历:先找左孩子,再找右孩子,最后找根节点
示例作为例子,它的 前中后序 遍历的结果分别如下图所示:
- 前序遍历
- 中序遍历
- 后序遍历
想要记住前中后序的顺序,有一个关键点:
前中后是指根节点的位置。(如中序遍历,就是根节点在中间,即前根后)
还有一点需要注意的是:遍历的顺序是指对于每一个节点都是相同的顺序遍历的。(以中序遍历为例,只要子树的左孩子不为空,就要优先读取)
二、实现
实现代码
实现的代码有两种方式:递归和遍历(推荐使用递归,代码更简洁,它两的时间和空间复杂度都是一样的)
递归
List<Integer> ret= new ArrayList<>();
/**
* 中序遍历(左根右)
*/
public List<Integer> inorderTraversal(TreeNode root) {
infixOrder(root);
return ret;
}
// 中序
public void infixOrder(TreeNode root) {
if (root == null)
return;
// 先找左孩子
infixOrder(root.left);
ret.add(root.val);
// 后找右孩子
infixOrder(root.right);
}
遍历
public List<Integer> inorderTraversal1(TreeNode root) {
List<Integer> res = new ArrayList<>();
Deque<TreeNode> stack = new ArrayDeque<>();
while (root != null || !stack.isEmpty()) {
// 先将所有左节点入栈
while (root != null) {
stack.push(root);
root = root.left;
}
root = stack.pop();
res.add(root.val);
root = root.right;
}
return res;
}
测试代码
public static void main(String[] args) {
TreeNode treeNode = new TreeNode(1, null, new TreeNode(2, new TreeNode(3), null));
new Number94().inorderTraversal(treeNode);
}
结果
我这里的提交结果是使用的递归,使用遍历的击败率也是差不多的。
三、总结
感谢看到最后,非常荣幸能够帮助到你~♥
如果你觉得我写的还不错的话,不妨给我点个赞吧!如有疑问,也可评论区见~