Leetcode513
1.问题描述
2.解决方案
解法一:迭代层序遍历
思路很简单就是层序遍历,然后记录最后一层,返回最后一层第一个结点的值
那么重点就是如何优雅的记录最后一层
1.首先要记录一个拷贝构造的一个初始化queue的方式queue<TreeNode*> preQueue(q),这个相当于记录了前一层的结点
2.如果当前层为空那自然前一层就是最后一层,直接返回第一个结点的值就好了
if(q.empty()= = true) return preQueue.front()->val
class Solution {
public:
int findBottomLeftValue(TreeNode* root) {
if(root== nullptr) return 0;
queue<TreeNode*> q;
q.push(root);
while(q.empty()== false){
int len=q.size();
queue<TreeNode*> preQueue(q);
for(int i=0;i<len;i++){
TreeNode* t=q.front();
q.pop();
if(t->left!= nullptr) q.push(t->left);
if(t->right!= nullptr) q.push(t->right);
}
if(q.empty()== true) return preQueue.front()->val;
}
//百分之百不会从这return的
return -1;
}
};
解法二:迭代层序遍历
解法一是要记录最后一层,这个思路就更简单了直接记录每一层第一个节点那最后记录的不就是最后一层的第一个节点,这个想法聪明多了!
if(i==0) ans=t->val;
return ans;
class Solution1 {
public:
int findBottomLeftValue(TreeNode* root) {
if(root== nullptr) return 0;
queue<TreeNode*> q;
q.push(root);
int ans;
while(q.empty()== false){
int len=q.size();
//queue<TreeNode*> preQueue(q);
for(int i=0;i<len;i++){
TreeNode* t=q.front();
q.pop();
if(i==0) ans=t->val;
if(t->left!= nullptr) q.push(t->left);
if(t->right!= nullptr) q.push(t->right);
}
//if(q.empty()== true) return preQueue.front()->val;
}
return ans;
//百分之百不会从这return的
//return -1;
}
};
解法三:递归
递归怎么说呢,比较巧妙,就是这个题我们第一想法肯定是层序遍历,递归第一时间可能不知道怎么做,但其实就是个回溯也不难,这个递归回溯很有价值,以后但凡有找一棵树中某个结点都可以用这个思路!
1.遇到深度更深的叶子节点就更新,相同深度的由于是先序遍历,所以递归中同一层结点第一个遍历到的绝对是每一层中的第一个节点if(root->left== nullptr&&root->right== nullptr&&curLayer>layer)
2.其中参数curlayer有回溯的痕迹find(root->left,curLayer+1)
class Solution2 {
public:
int ans;
int layer=INT32_MIN;
void find(TreeNode* root,int curLayer){
if(root== nullptr) return;
if(root->left== nullptr&&root->right== nullptr&&curLayer>layer){
ans=root->val;
layer=curLayer;
}
if(root->left!= nullptr) find(root->left,curLayer+1);
if(root->right!= nullptr) find(root->right,curLayer+1);
}
int findBottomLeftValue(TreeNode* root) {
find(root,0);
return ans;
}
};