1. 程式人生 > >[LeetCode] Find Bottom Left Tree Value 尋找最左下樹結點的值

[LeetCode] Find Bottom Left Tree Value 尋找最左下樹結點的值

Given a binary tree, find the leftmost value in the last row of the tree.

Example 1:

Input:

    2
   / \
  1   3

Output:
1

Example 2: 

Input:

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

Output:
7

Note: You may assume the tree (i.e., the given root node) is not NULL.

這道題讓我們求二叉樹的最左下樹結點的值,也就是最後一行左數第一個值,那麼我首先想的是用先序遍歷來做,我們維護一個最大深度和該深度的結點值,由於先序遍歷遍歷的順序是根-左-右,所以每一行最左邊的結點肯定最先遍歷到,那麼由於是新一行,那麼當前深度肯定比之前的最大深度大,所以我們可以更新最大深度為當前深度,結點值res為當前結點值,這樣在遍歷到該行其他結點時就不會更新結果res了,參見程式碼如下:

解法一:

class Solution {
public:
    int findBottomLeftValue(TreeNode* root) {
        if (!root) return
0; int max_depth = 1, res = root->val; helper(root, 1, max_depth, res); return res; } void helper(TreeNode* node, int depth, int& max_depth, int& res) { if (!node) return; if (depth > max_depth) { max_depth = depth; res
= node->val; } helper(node->left, depth + 1, max_depth, res); helper(node->right, depth + 1, max_depth, res); } };

其實這道題用層序遍歷更直接一些,因為層序遍歷時遍歷完當前行所有結點之後才去下一行,那麼我們再遍歷每行第一個結點時更新結果res即可,根本不用維護最大深度了,參見程式碼如下:

解法二:

class Solution {
public:
    int findBottomLeftValue(TreeNode* root) {
        if (!root) return 0;
        int res = 0;
        queue<TreeNode*> q;
        q.push(root);
        while (!q.empty()) {
            int n = q.size();
            for (int i = 0; i < n; ++i) {
                TreeNode *t = q.front(); q.pop();
                if (i == 0) res = t->val;
                if (t->left) q.push(t->left);
                if (t->right) q.push(t->right);
            }
        }
        return res;
    }
};

參考資料: