题目
给定一个二叉树的 根节点 root
,请找出该二叉树的 最底层 最左边 节点的值。
假设二叉树中至少有一个节点。
示例 1:
输入: root = [2,1,3]
输出: 1
示例 2:
输入: [1,2,3,4,null,5,6,null,null,7]
输出: 7
提示:
- 二叉树的节点个数的范围是
[1,10^4]
-
解题方法
层序遍历
层序遍历二叉树的每一层,用最左侧节点值更新返回结果。
时间复杂度O(n)
,空间复杂度O(n)
C++代码:/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
int findBottomLeftValue(TreeNode* root) {
queue<TreeNode*> nodes;
int result = 0;
if(!root) return result;
nodes.push(root);
while(nodes.size()>0) {
int size = nodes.size();
result = nodes.front()->val;
for(int i=0; i<size; i++) {
if(nodes.front()->left) nodes.push(nodes.front()->left);
if(nodes.front()->right) nodes.push(nodes.front()->right);
nodes.pop();
}
}
return result;
}
};
DFS
前序遍历保证首先搜索到每一层最左叶子,判断当前节点是否为叶子节点,记录最左叶子值以及对应深度,若遇见叶子节点且深度大于记录的深度,则更新记录的最左叶子值。
时间复杂度O(n)
, 空间复杂度O(n)
C++代码:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} * }; */ class Solution { public: void DFS(TreeNode* cur, int& maxval, int& maxlevel, int level) { if(!cur) return; if(!cur->left && !cur->right) { if(level>maxlevel) { maxval = cur->val; maxlevel = level; } } DFS(cur->left, maxval, maxlevel, level+1); DFS(cur->right, maxval, maxlevel, level+1); } int findBottomLeftValue(TreeNode* root) { int maxval = 0; int maxlevel = 0; DFS(root, maxval, maxlevel, 1); return maxval; } };