代码随想录算法训练营第十五天| 层序遍历、 226.翻转二叉树、101. 对称二叉树
视频讲解推荐y总:http://www.acwing.com
层序遍历
我是一看就会,一写就费,先看代码:
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> res;
queue<TreeNode*> q;
if(root == NULL) return res;
q.push(root);
while(q.size())
{
vector<int> level;
int len = q.size();
while(len--)
{
TreeNode* t = q.front();
level.push_back(t->val);
if(t->left) q.push(t->left);
if(t->right) q.push(t->right);
q.pop();
}
res.push_back(level);
}
return res;
}
};
层序遍历的过程其实大家都清楚,如果跟我一样,就是只知道层序遍历的思路,然后会用到队列这个数据结构,代码就不知道了,突然发现,以前图省事错过的,逃避的,现在都要还回来。
行,不多感慨了,分析一下代码吧,一上来老规矩,先检查root,然后先让root进队,创建一个数组,存储每层的节点的数值,当一个节点出队的时候,就让他的左右子树进队(如果有左右子树的话)。最后每有一层结束,就把这一层加进结果中。
226.翻转二叉树
先看代码:
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
if(!root) return root;
swap(root->left,root->right);
invertTree(root->left);
invertTree(root->right);
return root;
}
};
这道题目归结起来就是一个根节点和左右孩子,将左右孩子互换,然后递归,递归这种算法我觉得并不好写,因为需要准确的找到递归结束的条件。
101. 对称二叉树
先看代码:
class Solution {
public:
bool dfs(TreeNode* p,TreeNode* q)
{
if(!p && !q) return true;
if(!p || !q || p->val != q->val) return false;
return dfs(p->left,q->right) && dfs(p->right,q->left);
}
bool isSymmetric(TreeNode* root) {
if(!root) return true;
return dfs(root->left,root->right);
}
};
这道题目其实不难,但是它让我加深了反向思维,有的时候正向麻烦,反向反而会轻松一些,比如这个,如果正向写,条件就是左边等于右边,而且左子树或者右子树不能为空,还有就是一个节点的时候怎么办。反向就比较好,只要有一个子树为空或者不相等,就返回false,所以我想起我老师以前说过的,递归并不好写。