【Leetcode二叉树属性八】513. 找树左下角的值

本文介绍了三种方法来解决LeetCode 513问题,即寻找二叉树的最底部左值。解法一和解法二是迭代的层序遍历,不同之处在于记录最底层节点的方式,分别是通过额外的队列和直接保存每层第一个节点。解法三是采用递归,通过回溯找到最深叶子节点。这些解法提供了处理二叉树问题的不同思路。
摘要由CSDN通过智能技术生成

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;
    }
};
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值