一、题目
给定一个二叉树的根节点 root
,返回 它的 中序 遍历 。
示例 1:
输入: root = [1,null,2,3]
输出: [1,3,2]
更多细节请参看官方题目详情。
二、题解
2.1 遍历方法理解
2.1.1 中序遍历
中序遍历是二叉树遍历的一种方式,具体是先遍历左子树,然后遍历根节点,最后遍历右子树。记忆:左值右。
针对给定的二叉树root=[1,null,2,3],它的结构可以表示为:
1
\
2
/
3
按照中序遍历的方式,先遍历左子树,但是该树的左子树为空,所以不需要遍历,然后遍历根节点1,最后遍历右子树,按照左->根->右的顺序遍历,所以先遍历3,再遍历2,得到的结果是 [1,3,2]。
2.1.2 先序遍历
先序遍历和后序遍历也是二叉树的两种常用遍历方式。
先序遍历是指先遍历根节点,然后依次遍历左子树和右子树。具体的遍历顺序为:根节点,左子树,右子树。比如对于二叉树 [1,2,3,null,4,5,6,null,null,7,8],我们可以根据以下规则构建这个二叉树:
- 根节点为1;
- 节点1的左子节点为2,右子节点为3;
- 节点2的左子节点为null,右子节点为4;
- 节点3的左子节点为5,右子节点为6;
- 节点4的左子节点为null,右子节点为null;
- 节点5的左子节点为7,右子节点为8;
- 节点6的左子节点为null,右子节点为null;
- 节点7的左子节点为null,右子节点为null;
- 节点8的左子节点为null,右子节点为null。 根据以上规则,我们可以画出这棵二叉树的结构:
它的中序遍历结果为 [2,4,1,7,5,8,3,6]
它的先序遍历结果为 [1,2,4,3,5,7,8,6]。
2.1.3 后序遍历
后序遍历是指先遍历左子树和右子树,最后遍历根节点。具体的遍历顺序为:左子树,右子树,根节点。对于同一个二叉树,后序遍历的结果为 [4,2,7,8,5,6,3,1]。
2.2 代码
2.2.1 递归法
递归法,最重要的就是明确递归的终止条件
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
vector<int> result;
visitValue(root,result);
return result;
}
void visitValue(TreeNode* node, vector<int>& result)
{
if(node == nullptr) return;
visitValue(node->left, result);
result.push_back(node->val);
visitValue(node->right, result);
}
};
2.2.2 迭代法
可以看出递归法的效率很高,但是内存耗费很大;官方还提出了 进阶思路 “进阶: 递归算法很简单,你可以通过迭代算法完成吗?” 大家可以自己尝试一下~
三、总结
题目 | 知识点 | 进度 |
---|---|---|
136 | 数组、位运算(异或)、哈希表 | 1 |
121 | 数组、动态规划 | 2 |
3 | 字符串、滑动窗口、哈希表 | 3 |
94 | 二叉树、递归 | 4 |