本篇文章将向各位介绍三道典型的二叉树题目,每一道题我在做的时候都是想不到,一看题解就看懂了,然后骂自己是个SB~
下面三道的分类都是简单,能理解递归的就能做,大佬可以先略过了~
好了,话不多说,先来看第一道
先上代码
int maxDepth(TreeNode* root) {
if(root==nullptr){
return 0;
}
int l_max=maxDepth(root-> left);
int r_max=maxDepth(root->right);
return max(l_max,r_max)+1;
}
这道题,直接递归就可以获得最后的结果,先递归获取左子树最大深度,再递归获取右子树最大深度,最后+1表示根节点,然后取左右子树的最大值,就是整棵树的最大深度!
第二道题
再上代码
bool isSameTree(TreeNode* p, TreeNode* q) {
if(p==nullptr || q==nullptr)return p==q;
return p->val==q->val && isSameTree(p->left,q->left) && isSameTree(p->right,q->right);
}
这道题就更简单了,直接两行代码就完事儿了,但是你能想到并写出来其实还是有点儿不太容易,因为递归的思想没有理解透彻,那做这么多的题可能就有点儿难受了,因为你会发现最后刷完题下来最多只是你做过的会了,稍微上点儿难度就开始卡了~
第三道
226. 翻转二叉树
也是直接上代码
TreeNode* invertTree(TreeNode* root) {
if(root==nullptr)return root;
TreeNode* lefts=invertTree(root->left);
TreeNode* rights=invertTree(root->right);
root->left=rights;
root->right=lefts;
return root;
}
好了,如果你能看懂前两道的递归思路,那么最后一道题的递归也不难理解~
看完这三道题,有没有总结出递归的思想是啥,如果没有建议找一道简单的题然后照着题解先抄一遍,然后debug每一行代码看看具体是怎么执行的;这里我先说说我的一点看法,递归无非就是很多个for循环,一层套一层,但是每次层他做的事儿又都是相同的,最后返回的结果又能供上一层继续使用~
好了,希望读到这儿你能有所收获,也不枉我上班还在这儿摸鱼写博客了~