今天写了几道比较简单的题目,简单记录一下
一、二叉树第二小的结点
这道题并没有什么非常巧妙的解法,通过暴力法可以解出。我们对树进行一个遍历,便能获得所有的值,再进行一次排序即可。比较简单的想法即可。
本题复习了STL中的迭代器的知识,利用auto进行判断,for(it = u.begin;it!=u.end;it++) { *it; } 是使用迭代器遍历容器的标准过程,需要熟练掌握。
class Solution {
public:
int findSecondMinimumValue(TreeNode* root) {
set<int> myset;
vector<int> mylist;
find(root,myset);
for(auto it = myset.begin();it!=myset.end();it++){
mylist.push_back(*it);
}
sort(mylist.begin(),mylist.end());
if (mylist.size()<2){
return -1;
}
return mylist[1];
}
void find(TreeNode* root, set<int> &set){
if (root==NULL)
return;
else{
set.insert(root->val);
find(root->left,set);
find(root->right,set);
}
}
};
二、二叉树的最小深度
思路: 本题要求最小深度。那么,根据深度的定义,是根节点到叶子结点的最短路径。一种方法是使用广度优先遍历,当搜索到第一个叶子结点的时候,返回深度即可。(广度优先搜索,由于是从上到下搜索,第一个叶子结点一定是深度最小的结点)深度的更新,是在出队列的时候,(广度优先搜索,上一层出队,它的左子树结点和右子树结点入队,深度正好+1)。
除此之外,我们也可以使用递归的思想。根节点到某个叶子结点的深度等于左子树和右子树深度较小的那个值+1。但是要注意一个问题,如果一个结点只有一个子树,那么它的另一个子树深度虽然为0,但是不能算在内!因为这不是叶子结点该递归产生的结果。
递归详解:
空树的深度为0
只有一个子树的结点的深度为它的唯一的那棵子树深度+1
普通结点的深度为min{左子树深度,右子树深度} +1
class Solution {
public:
int minDepth(TreeNode* root) {
if(root == NULL){
return 0;
}
if (root->left==NULL && root->right !=NULL){
return minDepth(root->right)+1;
}
if (root->left!=NULL && root->right ==NULL){
return minDepth(root->left)+1;
}
int left = minDepth(root->left);
int right = minDepth(root->right);
return (left>right) ? right+1:left+1;
}
};