LeetCode513. Find Bottom Left Tree Value题解
来源:互联网 发布:js精确到小数点后两位 编辑:程序博客网 时间:2024/05/16 04:17
1. 题目描述
Given a binary tree, find the leftmost value in the last row of the tree.
2. 样例
3. 分析
这道题的思路和LeetCode515的思路很像,都是BFS和层次遍历的算法。有了之前题目的经验,这里我仍然采取两种思路解这道题:递归与非递归。
3.1. 非递归法
层次遍历法,题目描述是要求找到最后一行的最左面的元素,首先我们得找到最后一行,于是仍然使用两个队列进行遍历,分别保存:已经访问的节点和节点所在的层数。
由于我们实现的层次遍历是每一次都先从节点的左孩子压入队列,紧接着才是右孩子,所以其实树的每一层最开始压入队列的元素就是最左面的元素。
实现方式就是:设置两个变量记录当前节点所在层数和上一次访问的节点所在层数,如果当前的层数高于上一次的层数,说明就开始访问新的一层了,那么此时的节点就是该层最左面的节点。我们只要返回最后那层的节点即可。
3.2. 递归法
说实话,这个想法我是有的,不过写起来有的复杂,看了讨论区大佬的算法,简单清晰。
多态:新写了一个同名的函数,这里面有一个call by reference的参数maxDepth和一个call by value的参数depth。前者随着访问值在变化,一直记录着已经经历过的最大层数,后者则是当前节点的层数。由于递归仍然是从左孩子先开始,所以只有当maxDepth < depth的时候才是进入新的一层,此时节点就是新的一层最左面的节点,接下来使用相同的方法,返回该节点的值。
4. 源码
4.1. 非递归法
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public: int findBottomLeftValue(TreeNode* root) { queue<TreeNode*>tree; queue<int>level; TreeNode* current_node = root; int result = -1; int current_level = 0; int last_level = -1; if (current_node != NULL) { result = current_node->val; tree.push(current_node); level.push(current_level); while(!tree.empty()) { current_node = tree.front(); tree.pop(); current_level = level.front(); level.pop(); if (current_node->left != NULL) { tree.push(current_node->left); level.push(current_level+1); } if (current_node->right != NULL) { tree.push(current_node->right); level.push(current_level+1); } if (current_level > last_level) { result = current_node->val; } last_level = current_level; } } return result; }};
4.2. 递归法
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public: void findBottomLeftValue(TreeNode* root, int& maxDepth, int& leftVal, int depth) { if (root == NULL) { return; } findBottomLeftValue(root->left, maxDepth, leftVal, depth+1); findBottomLeftValue(root->right, maxDepth, leftVal, depth+1); //由于先从左边开始递归,并且maxDepth可以记录当前最大深度,所以只有触发此机制的时候才是新的一层的开始 if (depth > maxDepth) { maxDepth = depth; leftVal = root->val; } } int findBottomLeftValue(TreeNode* root) { int maxDepth = 0; int leftVal = root->val; findBottomLeftValue(root, maxDepth, leftVal, 0); return leftVal; }};
5. 心得
使用BFS,递归虽好,但是难点在于如何将原问题进行分解以及找到合适的递归出口。
0 0
- LeetCode513. Find Bottom Left Tree Value题解
- leetcode513. Find Bottom Left Tree Value
- Leetcode513. Find Bottom Left Tree Value
- LeetCode513. Find Bottom Left Tree Value
- 24.leetCode513:Find Bottom Left Tree Value
- python--leetcode513. Find Bottom Left Tree Value
- 【Leetcode513 Find Bottom left Tree Value】树的遍历
- Leetcode题解:513. Find Bottom Left Tree Value
- Find Bottom Left Tree Value
- Find Bottom Left Tree Value
- Find Bottom Left Tree Value
- Find Bottom Left Tree Value
- Find Bottom Left Tree Value
- Find Bottom Left Tree Value
- Find Bottom Left Tree Value
- Find Bottom Left Tree Value
- Find Bottom Left Tree Value
- Find Bottom Left Tree Value
- 51 Nod 1430 奇偶游戏(博弈)
- 使用DDMS查看data下数据、ADB环境变量的配置
- 关于一些Vue的文章。(2)
- Edittext和软键盘的关系应用
- java笔记JVM1
- LeetCode513. Find Bottom Left Tree Value题解
- malloc的开辟----重修订
- MCU—直流电机
- Callable与Future
- LeetCode 26. Remove Duplicates from Sorted Array
- Oracle代码大全.从入门到熟练
- 【phi】
- 百度富文本编辑器的上传图片的路径问题
- python替换特定字符串