找树左下角的值

题目

给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最左边 节点的值。

假设二叉树中至少有一个节点。

示例 1:

输入: root = [2,1,3]
输出: 1
示例 2:

输入: [1,2,3,4,null,5,6,null,null,7]
输出: 7

思路

  • 这道题目的关键是方法,如果选用的是层序遍历的方法,其实很好理解,我们只需要用result记录每一层的第一个数,最后出来的result也就是答案。
  • 如果用的是后序遍历,那么就有点麻烦了,你怎么判断是最后一层的第一个元素,两个条件
    1. 第一次达到这个深度;
    2. 一定是左节点比右节点先到达,所以遍历顺序是前序,中序还是后序都没有关系

代码

  1. 层序遍历
    class Solution {
    public:
        int findBottomLeftValue(TreeNode* root) {
            //最简单的,使用层序遍历,因为都是访问所有的节点,二者的时间复杂度都是一样的
            queue<TreeNode*> qu;
            if(root == NULL) {
                return 0;  
            }
            int result;
            qu.push(root);
            while(!qu.empty()) {
                int n = qu.size();
                result = qu.front()->val;
                for(int i = 0; i < n; i++) {
                    TreeNode* pos = qu.front();
                    qu.pop();
                    if(pos->left) {
                        qu.push(pos->left);
                    }
                    if(pos->right) {
                        qu.push(pos->right);
                    }
                }
            }
            return result;
        }
    };
    
  2. 后序遍历
    //这个节点有点特殊,那就是第一次到达该层的时候第一个记录的节点那就是最左边的节点
    class Solution {
    public:
        int maxD;
        int result;
        void dfs(TreeNode* cur, int dep) {
            if(cur == NULL) {
                return;
            }
            if(!cur->left && !cur->right) {
                if(dep > maxD) {
                    result = cur->val;
                    maxD = dep;
                }
                return;
            }
            
            if(cur->left) {
                dfs(cur->left, dep + 1);
            }
            if(cur->right) {
                dfs(cur->right, dep + 1);
            }
        }
        int findBottomLeftValue(TreeNode* root) {
            maxD = -1;
            dfs(root, 0);
            return result;
        }
    };
    
posted @ 2023-03-20 16:47  铜锣湾陈昊男  阅读(3)  评论(0)    收藏  举报