刚开始刷leetcode,先从树开始刷起吧,一直没时间,现在终于什么都定下来了。(首先从树最简单的题目开始刷起)
借助树来培养框架思维!!!
1.第一题
.
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
bool isSameTree(TreeNode* p, TreeNode* q) {
//如果两个树都是空的,那自然相同
if(p==NULL&&q==NULL){
return true;
}else if(p!=NULL&&q!=NULL&&p->val==q->val){ //如果树不空并且根节点的值相等
//那就开始递归遍历左右子树
return isSameTree(p->left,q->left)&&isSameTree(p->right,q->right);
}else return false;
}
};
注意写的时候语法问题,我们传入的是结构体指针,不是结构体,所以用 -> 符号
2.第二题(判断二叉树是否对称)
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
bool isSymmetric(TreeNode* root) {
//如果树为空,符合
if(root==NULL){
return true;
}
//递归遍历根节点的左右子树
return cmp(root->left,root->right);
}
//增加了一个比较函数,比较左右两个子树
bool cmp(TreeNode* lNode,TreeNode* RNode){
if(lNode==NULL&&RNode==NULL) return true;
//注意:这里不能忘记需要判断两个节点值是否相等,进入第二层时就能看出来
//如果不加这个条件,那么1,2,3就无法通过
if(lNode==NULL||RNode==NULL||lNode->val!=RNode->val) return false;
//对称的特点就是左子树的左子值和右子树的右子值相等,左子树的右子值和右子树的左子值相等
return cmp(lNode->left,RNode->right)&&cmp(lNode->right,RNode->left);
}
};
3.第三题(求二叉树的最大深度)
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
int maxDepth(TreeNode* root) {
//二叉树为空是时,深度为0
if(root==NULL) return 0;
//不为空时,分别深度遍历左右子树,每次都+1,并且取左右子树最大的那个
return max(maxDepth(root->left),maxDepth(root->right))+1;
}
};