本文最后更新于: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;     } };
 
  |