《剑指 Offer》专项突破版 - 面试题 45 和 46 : 二叉树最低层最左边的值和二叉树的右侧视图(C++ 实现)

目录

面试题 45 : 二叉树最低层最左边的值

面试题 46 : 二叉树的右侧视图


 


面试题 45 : 二叉树最低层最左边的值

题目

如何在一棵二叉树中找出它最低层最左边节点的值?假设二叉树中最少有一个节点。例如,在下图所示的二叉树中最低层最左边一个节点的值是 5。

《剑指 Offer》专项突破版 - 面试题 45 和 46 : 二叉树最低层最左边的值和二叉树的右侧视图(C++ 实现)_第1张图片

分析

这是一个关于二叉树的问题,而且还与二叉树的层相关,因此基本可以确定这个题目是在考查二叉树的广度优先搜索。通常,广度优先搜索算法是从上到下遍历二叉树的每一层,并且从左到右遍历同一层中的每个节点。位于某一层最左边的节点就是该层中第 1 个遍历到的节点,最低层最左边的节点就是最后一层的第 1 个节点

可以用一个变量 bottomLeft 来保存每一层最左边的节点值。在遍历二叉树时,每当遇到新的一层时就将变量 bottomLeft 的值更新为该层第 1 个节点的值。当整棵二叉树都被遍历完之后,变量 bottomLeft 的值就是最后一次更新的值,也就是最后一层的第 1 个节点的值

代码实现

class Solution {
public:
    int findBottomLeftValue(TreeNode* root) {
        queue q;
        q.push(root);  // 二叉树中最少有一个节点
        int curLevelSize = 1;
        int bottomLeft = root->val;
        while (curLevelSize)
        {
            while (curLevelSize--)
            {
                TreeNode* front = q.front();
                q.pop();
                if (front->left)
                    q.push(front->left);
                
                if (front->right)
                    q.push(front->right);
            }
            curLevelSize = q.size();
            if (curLevelSize != 0)
                bottomLeft = q.front()->val;
        }
        return bottomLeft;
    }
};


面试题 46 : 二叉树的右侧视图

题目

给定一棵二叉树,如果站在该二叉树的右侧,那么从上到下看到的节点构成二叉树的右侧视图。例如,下图中二叉树的右侧视图包含节点 8、节点 10 和节点 7。请写一个函数返回二叉树的右侧视图节点的值。

《剑指 Offer》专项突破版 - 面试题 45 和 46 : 二叉树最低层最左边的值和二叉树的右侧视图(C++ 实现)_第2张图片

分析

这个题目提出了一个新概念,即二叉树的右侧视图。当站在二叉树的右侧时,看到的应该是每层最右边的一个节点,而每层的其他节点都被最右边的节点挡住。因此,二叉树的右侧视图其实就是从上到下每层最右边的节点

代码实现

class Solution {
public:
    vector rightSideView(TreeNode* root) {
        vector result;
        if (root == nullptr)
            return result;
        
        queue q;
        q.push(root);
        int curLevelSize = 1;
        while (curLevelSize)
        {
            while (curLevelSize--)
            {
                TreeNode* front = q.front();
                q.pop();
                if (curLevelSize == 0)
                    result.push_back(front->val);
​
                if (front->left)
                    q.push(front->left);
​
                if (front->right)
                    q.push(front->right);
            }
            curLevelSize = q.size();
        }
        return result;
    }
};
 

你可能感兴趣的:(数据结构,c++,算法,leetcode,开发语言,数据结构,职场和发展)