寻找二叉树最底层的最左元素

2018-03-22  本文已影响0人  林逸凡_lyf

题目说明

这是leetcode上面的一道中等算法题:https://leetcode.com/problems/find-bottom-left-tree-value/description/

说明如下:
Given a binary tree, find the leftmost value in the last row of the tree.
找到位于二叉树最底层最左边的元素的值。

示例:

Input:
    1
   / \
  2   3
 /   / \
4   5   6
   /
  7

Output:
7

解题思路

这道题其实是求二叉树深度的变形题。我的思路是在遍历的时候进行计数,每访问一个节点level+1,之后将最大深度depth与当前深度level比较,如果depth小于level,则将当前节点的值赋给result。因为我们需要得到的是最左的元素,所以采取先左后右的遍历方法,这样便可以保证在遍历新的一层的时候,第一个遍历到的节点一定是最左边的节点。

代码实现

C++
/**
 * 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) {
        int depth = 0;
        int result = root->val;
        visitNode(root, 0, depth, result);
    
        return result;
    }

    void visitNode(TreeNode* pNode, int level, int &depth, int& result) {
        level++;
        if (depth < level) {
            result = pNode->val;
            depth = level;
        }
    
        if (pNode->left) {
            visitNode(pNode->left, level, depth, result);
        }
        if (pNode->right) {
            visitNode(pNode->right, level, depth, result);
        }
    }
};

反思

我的visitNode函数传入了四个参数用于计算当前深度、最大深度和返回结果,但是感觉太过冗余。之后我会尝试通过返回值方法或者while循环来简化函数。
如果你有什么更简洁高效的想法也可以在留言里留言,大家一起讨论学习。

上一篇 下一篇

猜你喜欢

热点阅读