本文最后更新于:2021年2月12日 晚上
给定一个二叉树,在树的最后一行找到最左边的值。
示例 1:
示例 2:
| 输入:
1 / \ 2 3 / / \ 4 5 6 / 7
输出: 7
|
注意: 您可以假设树(即给定的根节点)不为 NULL。
Solution
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
|
class Solution { public: int findBottomLeftValue(TreeNode* root) { int res = root->val; queue<TreeNode *> que; que.push(root); while (!que.empty()) { int n = que.size(); res = que.front()->val; for (int i = 0; i < n; ++i) { TreeNode *node = que.front(); que.pop(); if (node->left) que.push(node->left); if (node->right) que.push(node->right); } } return res; } };
|
回溯法,参考 代码随想录
使用前序遍历,这样才先优先左边搜索,然后记录深度最大的叶子节点,此时就是树的最后一行最左边的值。
递归函数的参数必须有要遍历的树的根节点,还有就是一个int型的变量用来记录最长深度。不需要返回值了,所以递归函数的返回类型为void。
需要类里的两个全局变量,maxLen 用来记录最大深度,maxleftValue 记录最大深度最左节点的数值。(因为每一层最左边的节点总是第一个遍历到)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| class Solution { public: int maxLen = INT_MIN; int maxleftValue; void traversal(TreeNode* root, int leftLen) { if (root->left == nullptr && root->right == nullptr) { if (leftLen > maxLen) { maxLen = leftLen; maxleftValue = root->val; } } if (root->left) { leftLen++; traversal(root->left, leftLen); leftLen--; } if (root->right) { leftLen++; traversal(root->right, leftLen); leftLen--; } } int findBottomLeftValue(TreeNode* root) { traversal(root, 0); return maxleftValue; } };
|