因为二叉树和递归这块儿学的比较菜,所以先从简单题做起。
5道简单题:
1、二叉树的最大深度(难度:简单)
AC代码
没啥说的,前序遍历
/**
* 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 res=0;
int depth=0;
int maxDepth(TreeNode* root) {
traverse(root);
return res;
}
void traverse(TreeNode* root){
if(root==NULL){
return;
}
//前序位置
depth++;
res=max(res,depth);
traverse(root->left);
traverse(root->right);
//后序位置
depth--;
}
};
2、二叉树的直径(难度:简单)
AC代码
思路看了以为会了,结果写的时候发现还是没有掌握要领。
一个小经验:就是只想某一个结点的思路,别去想一整棵树的思路,因为递归会帮你实现其他结点,想得多反而思路容易乱。
思路:
我一开始在求二叉树的最大深度和求每一个结点的左右子树结点个数这两个思路之间来回徘徊,分别写了代码之后发现又不是我想要的,总之就是乱的不行。这个时候我发现,自己的思维是受限制的,受到之前看过的模板的限制,失去了自己的分析。
这个题求直径,其实就是求一个结点的左右子树深度之和,然后找最大值。
那么对一个结点来说,出去基本的代码步骤,需要考虑的两个地方就是返回值和最大值的更新。
返回值:既然是求深度,那么每次返回的都应该是左右子树里深度最大的,取大值,并且要把根结点加上,代表了以返回到的节点为根的这课子树的深度,这当然包含根结点,所以要+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 answer;
//左右子树的深度
int depth(TreeNode* root){
if(root==NULL){
return 0;
}
int l=depth(root->left);
int r=depth(root->right);
answer=max(answer,l+r);
return max(l,r)+1;
}
int diameterOfBinaryTree(TreeNode* root) {
answer=0;
depth(root);
return answer;
}
};
3、二叉树的坡度(难度:简单)
AC代码
吸取上一个题的经验,终于有点思路了。
/**
* 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 answer;
int depth(TreeNode* root){
if(root==NULL){
return 0;
}
int l=depth(root->left);
int r=depth(root->right);
root->val+=l+r;
// cout<<"root->val:"<<root->val<<endl;
answer+=abs(l-r);
return root->val;
}
int findTilt(TreeNode* root) {
answer=0;
depth(root);
return answer;
}
};
4、二叉树的前序遍历(难度:简单)
AC代码
水题
/**
* 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:
vector<int> answer;
void traverse(TreeNode* root){
if(root==NULL){
return;
}
answer.push_back(root->val);
traverse(root->left);
traverse(root->right);
}
vector<int> preorderTraversal(TreeNode* root) {
traverse(root);
return answer;
}
};
5、二叉树的最小深度(难度:简单)
AC代码
/**
* 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 depth;
int answer;
void traverse(TreeNode* root){
if(root==NULL){
return;
}
depth++;
if(root->left==NULL && root->right==NULL){
answer=min(answer,depth);
}
traverse(root->left);
traverse(root->right);
depth--;
}
int minDepth(TreeNode* root) {
depth=0;
answer=INT_MAX;
if(root==NULL){
answer=0;
}
traverse(root);
return answer;
}
};