代码随想录打卡第十二天
题目链接/文章讲解/视频讲解:代码随想录
这个题目不难,使用前序遍历的方法,对结点的处理是交换左右孩子。
/*** 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:void traversal(TreeNode* node){if(node==NULL){return;}swap(node->left,node->right);traversal(node->left); //左traversal(node->right); //右}TreeNode* invertTree(TreeNode* root) {traversal(root);return root;}
};
自己试了中序遍历发现不行,直接看的题解,题解给的很简单。
/*** 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:bool isSymmetric(TreeNode* root) {return root == nullptr || recur(root->left, root->right);}
private:bool recur(TreeNode* L, TreeNode* R) {if (L == nullptr && R == nullptr) //如果左右有同时为空 说明同时并且遍历到了叶子结点 此结点对称的 {return true;}if (L == nullptr || R == nullptr || L->val != R->val) //如果左右只有一个为空 说明不对陈 或者 左值不等于对称的右值{return false;}return recur(L->left, R->right) && recur(L->right, R->left);}
};
使用层序遍历,每次遍历单层就是深度+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://这个题目就是层序遍历找几层int maxDepth(TreeNode* root) {int depth=0;//存入结果的数组queue<TreeNode*> que;//存入结点的队列if(root!=NULL){que.push(root);//}while(!que.empty())//队列非空 说明队列中有结点{int size=que.size();//当前队列的所有元素个数,就是本层的节点数for(int i=0;i<size;i++){TreeNode* node=que.front();que.pop();if(node->left){que.push(node->left);}if(node->right){que.push(node->right);}}depth++;//遍历完一层就+1}return depth;}
};
此题目也是用层序遍历,处理过程是如果发现某个结点的左孩子和右孩子同时为NULL,那么就是第一次找到了叶子节点
/*** 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:int minDepth(TreeNode* root) {int depth=0;//存入结果的数组queue<TreeNode*> que;//存入结点的队列if(root!=NULL){que.push(root);}while(!que.empty())//队列非空 说明队列中有结点{int size=que.size();//当前队列的所有元素个数,就是本层的节点数for(int i=0;i<size;i++){TreeNode* node=que.front();que.pop();if(node->left==NULL && node->right==NULL){return depth+1;}if(node->left){que.push(node->left);}if(node->right){que.push(node->right);}}depth++;//遍历完一层就+1}return depth;}
,直接返回深度+1,为什么+1,因为此层没有遍历完毕,多以手动+1;