0.背景
本来要讲其他题目,但是不讲了这个,中序遍历也是个事儿。先讲这个简单题。
1.中序遍历
我们在学习二叉树时,都学习过中序遍历,这里的序,其实不便于理解。书本规范叫“中根遍历”多好?不言而喻了,是不是?直接就知道遍历左、根、右。
好,我们现在开始按照递归程序进行分析。
二叉树的结构如下:
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode() : val(0), left(NULL), right(NULL) {}
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
};
我们可以发现,这个结构是有左右子树的指针的,也就是,是有递推关系的哦。我们假设有一个无穷深的满二叉树:
一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。 也就是说,如果一个二叉树的层数为 k k k ,且结点总数是 2 k − 1 2^{k} -1 2k−1 ,则它就是满二叉树。
node->left
node->right
node->left->right->...->left
在数据结构中,我们提到节点或结点,都是指一种东西。
所以,递推关系知道,临界条件无非就是遍历当前的这个根节点。
这个思路很重要,我们很多二叉树的问题,都要把问题试图推导到只剩下一个根节点,然后对根节点进行操作。
有了以上的思路,易得:
vector<int> inorderTraversal(TreeNode* root) {
vector<int> vec;
helperT(vec,root);
return vec;
}
void helperT(vector<int>& vec,TreeNode* node){
if(node!=NULL){
helperT(vec,node->left);
vec.push_back(node->val);
helperT(vec,node->right);
}
}
2.扩展阅读
官方题解中,是这样写代码的:
class Solution {
public:
void inorder(TreeNode* root, vector<int>& res) {
if (!root) {
return;
}
inorder(root->left, res);
res.push_back(root->val);
inorder(root->right, res);
}
vector<int> inorderTraversal(TreeNode* root) {
vector<int> res;
inorder(root, res);
return res;
}
};
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/binary-tree-inorder-traversal/solution/er-cha-shu-de-zhong-xu-bian-li-by-leetcode-solutio/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
虽然使用了c++的新特性,但是从结构上也能看出不同,它是先判断了空。
这种风格,被称为卫式语句(卫语句)
卫(
guard
)是布尔表达式,其结果必须为真,程序才能执行下去。卫语句(guard code
或guard clause
)用于检查先决条件。
它的核心思想是避免if-else
深层嵌套,怎么样?你学会了吗?欢迎托梦给我,或者在评论区和其他读者一起讨论。