【LeetCode二叉树#08】寻找树左下角的值(回溯机制X深度)

找树左下角的值

力扣题目链接(opens new window)

给定一个二叉树,在树的最后一行找到最左边的值。

示例 1:

513.找树左下角的值

示例 2:

513.找树左下角的值1

思路

层序遍历

这个是很自然的思路,因为层序遍历可以避免对于“最底层”这个要求的繁琐判定

在层序遍历的过程中,我们只需要保存最后一层的结果即可

代码

和标准的层序遍历写法一样

class Solution {
public:
    //层序遍历
    int findBottomLeftValue(TreeNode* root) {
        //定义队列
        queue<TreeNode*> que;
        if(root != NULL) que.push(root);//判定根节点
        int res;
        while(!que.empty()){//遍历队列
            int size = que.size();//记录队列长度
            for(int i = 0; i < size; ++i){
                TreeNode* node = que.front();
                que.pop();
                //判断,如果到了最后一层,那么就保存该节点的值
                if(i == 0) res = node->val;

                if(node->left) que.push(node->left);
                if(node->right) que.push(node->right);
            }
        }
        return res;
    }
};
递归法

这里使用递归法的话没有层序遍历那么直观,但是因为其涉及到了递归法求深度的概念以及对于回溯的应用,所以还是记录一下

三部曲

1、确定递归函数的参数和返回值

传入参数是根节点,另需要一个变量记录深度的更新值

void traversal(TreeNode* node, int deep){
    
}

2、确定终止条件

因为我们是靠递归遍历来不断获取深度的

因此当遇到叶子节点时就要更新当前的深度信息

int maxDeep = INT_MIN;
int res;

void traversal(TreeNode* node, int deep){
    if(node->left == NULL && node->right == NULL){
        if(deep > maxDeep){
            maxDeep = deep;//更新深度
            //记录当前叶子节点值
            res = node->val;
        }
        return;
    }
}

3、确定单层逻辑

使用前序遍历即可,这里依旧要使用回溯

int maxDeep = INT_MIN;
int res;

void traversal(TreeNode* node, int deep){
    if(node->left == NULL && node->right == NULL){
        if(deep > maxDeep){
            maxDeep = deep;//更新深度
            //记录当前叶子节点值
            res = node->val;
        }
        return;
    }
    
    if(node->left){
        //记录深度
        deep++;
        traversal(node, deep);
        //回溯,深度减1
        deep--;
    }
    if(node->right){
        //记录深度
        deep++;
        traversal(node, deep);
        //回溯,深度减1
        deep--;
    }
    return;
}

这里使用回溯的主要目的是为了让每个分支都能被遍历到,进而确认每个叶子节点,获取最底层的那个

代码
class Solution {
public:
    //递归
    //确定递归函数的参数和返回值
    int maxDeep = INT_MIN;
	int res;

    void traversal(TreeNode* node, int deep){
        if(node->left == NULL && node->right == NULL){
            if(deep > maxDeep){
                maxDeep = deep;//更新深度
                //记录当前叶子节点值
                res = node->val;
            }
            return;
        }

        if(node->left){
            //记录深度
            deep++;
            traversal(node->left, deep);
            //回溯,深度减1
            deep--;
        }
        if(node->right){
            //记录深度
            deep++;
            traversal(node->right, deep);
            //回溯,深度减1
            deep--;
        }
        return;
    }
    
    int findBottomLeftValue(TreeNode* root) {
        int deep = 0;
		traversal(root, deep);
        return res;
    }
};
posted @ 2023-02-26 15:13  dayceng  阅读(17)  评论(0编辑  收藏  举报