Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >二叉树的左视图

二叉树的左视图
EN

Stack Overflow用户
提问于 2022-08-29 20:33:02
回答 2查看 72关注 0票数 1

若要查找从二叉树左侧可见的所有节点集,请执行以下操作。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
   vector<int> getLeftView(TreeNode<int> *root)
    {
         static vector<int> res;
       // Your code here
       if(root){
           res.push_back(root->data);
           if(root->left)
                getLeftView(root->left);
           else
                getLeftView(root->right);
       }
       return res;
}

对于单个测试用例,一次工作很好。但是,当运行多个测试用例时,向量中的前一个值将被新值追加。在运行下一个测试用例之前,如何清除向量?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-08-29 20:39:26

使用static是因为需要跨递归使用向量的单个实例。但是static不是方法,它导致整个程序中只有一个向量的实例。

有多种解决方案,其中之一是将函数拆分为API和递归部分:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void getLeftViewRec(TreeNode<int> *root, vector<int> &res)
{
    if(root){
        res.push_back(root->data);
        if(root->left)
             getLeftView(root->left, res);
        else
             getLeftView(root->right, res);
    }
    return res;
}


vector<int> getLeftView(TreeNode<int> *root)
{
    vector<int> res;
    getLeftViewRec(root, res);
    return res;
}

现在发生的情况是,每次调用getLeftView时,都会将一个新的向量res实例化为局部变量。然后,它调用递归函数getLeftViewRec,该函数通过引用接收res,并通过递归调用将其传递给自己,因此递归处理一个向量,并将其累加到其中。

票数 1
EN

Stack Overflow用户

发布于 2022-08-29 20:40:48

使用队列和空指针标记每个级别的第一个元素。我们在第一个中插入一个空指针,当到达这个空指针时,我们将bool标记为true并将下一个元素作为我们的左视图元素,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// C++ Code for the above iterative approach
#include <bits/stdc++.h>
using namespace std;

// Tree Node Structure contains data, left and right
// pointer
struct Node {
    int data;
    struct Node *left, *right;
};

// A utility function to
// create a new Binary Tree Node
struct Node* newNode(int item)
{
    struct Node* temp
        = (struct Node*)malloc(sizeof(struct Node));
    temp->data = item;
    temp->left = temp->right = NULL;
    return temp;
}

// function to get the left view of binary tree in vector
vector<int> leftView(Node* root)
{

    // store the left view
    vector<int> ans;

    // Base Case : Empty Tree
    if (!root)
        return ans;
    

    // Create an empty queue and enque root node and null
    queue<Node*> q;
    q.push(root);
    q.push(NULL);
    bool ok = true;

    // Traverse till queue is not empty
    while (!q.empty()) {
        // get the front node and dequeue it from queue
        auto it = q.front();
        q.pop();

        // if the front node is null do following steps
        if (it == NULL) {
            if (ok == false)
                ok = true;
            

            if (q.size() == 0)
                break;
            
            else
                q.push(NULL);
            
        }
        // else do the following steps
        else {
            if (ok) {
                ans.push_back(it->data);
                ok = false;
            }

            if (it->left)
                q.push(it->left);
            
            if (it->right)
                q.push(it->right);
            
        }
    }

    // return the left view
    return ans;
}

// driver code to test above code on a test case
int main()
{
    /*
    Input :
                10
                / \
                2    3
            / \ / \
            7 8 12 15
                        /
                        14

    Output : 10 2 7 14
*/
    // let's build above shown tree
    Node* root = newNode(10);
    root->left = newNode(2);
    root->right = newNode(3);
    root->left->left = newNode(7);
    root->left->right = newNode(8);
    root->right->right = newNode(15);
    root->right->left = newNode(12);
    root->right->right->left = newNode(14);

    // call leftview function and store output in vec
    vector<int> vec = leftView(root);
    // traverse on left view and print each element
    for (int x : vec)
        cout << x << " ";
    cout << endl;

    return 0;
}
票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73537185

复制
相关文章
二叉树的遍历(左中右及层级)
大家好,我是热心的大肚皮,皮哥。以后我们又多了一个算法系列,会带着大家一起向着成神之路迈进。
热心的大肚皮
2023/02/28
2940
二叉树的遍历(左中右及层级)
二叉树——404. 左叶子之和
节点数在 [1, 1000] 范围内 -1000 <= Node.val <= 1000
向着百万年薪努力的小赵
2022/12/02
2090
二叉树——404. 左叶子之和
Leetcode|二叉树的属性|404. 左叶子之和
【解题要点】:需要通过节点的父节点来判断其左孩子是不是左叶子 【考核技能】:无父指针的树结构对于父节点操作的应用
SL_World
2021/09/18
3050
199. 二叉树的右视图
给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。 示例: 输入: [1,2,3,null,5,null,4] 输出: [1, 3, 4] 解释: 1 <--- / \ 2 3 <--- \ \ 5 4 <--- class Solution { List<Integer> list=new ArrayList(); public Lis
CaesarChang张旭
2021/07/08
2780
199. 二叉树的右视图
给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
张伦聪zhangluncong
2022/10/26
2400
Day21-二叉树-二叉树的右视图
接下来遍历到5节点,这时高度还是1,但数组的size()为2,二者并不相同了,所以要更新view数组,来保证存储的是最右边的节点。
BUPTrenyi
2019/07/15
6300
Day21-二叉树-二叉树的右视图
LeetCode-199-二叉树的右视图
给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
benym
2022/07/14
1910
Leetcode No.199 二叉树的右视图
给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
week
2021/11/29
2340
Leetcode No.199 二叉树的右视图
LeetCode36|二叉树的右视图
给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
码农王同学
2020/08/25
2700
LeetCode36|二叉树的右视图
图解LeetCode——199. 二叉树的右视图
给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
爪哇缪斯
2023/09/06
1520
图解LeetCode——199. 二叉树的右视图
图解LeetCode——199. 二叉树的右视图
给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
爪哇缪斯
2023/06/05
1940
图解LeetCode——199. 二叉树的右视图
js 实现二叉树的右侧视图
二叉树的右侧视图,使用层序遍历实现,需要先获取带有层级的二维数组,再将数组中每个数组的最后一个值获取到,即为右侧视图。
蓓蕾心晴
2022/09/24
6310
js 实现二叉树的右侧视图
​LeetCode刷题实战199:二叉树的右视图
算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !
程序员小猿
2021/03/04
2430
​LeetCode刷题实战199:二叉树的右视图
HQL的左连接_左连接与右连接的区别
,但是默认使用的内连接,就是说外键必须匹配的记录才能查出来,实现不了要求。 当我决定用左连接查询之后,做了很多尝试,但是因为对HQL不够熟悉,都没有达到要求。比如这样的
全栈程序员站长
2022/09/29
1.3K0
Hive左连接_oracle左外连接
大家好,又见面了,我是你们的朋友全栈君。 CREATE EXTERNAL TABLE IF NOT EXISTS a( telno STRING, other STRING ) PARTITIONED BY(day String) ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘|’;
全栈程序员站长
2022/10/02
1.3K0
RecyclerView的左滑实现
最终的效果图是这样的 要实现这样的一个效果,用到的关键技术: 自定义view的基本知识+事件处理+其它知识 一.右边的操作view 1.数据的组装 我们可以把右边的操作选项抽象出来数据对象即可,对于老
非著名程序员
2018/02/09
1.8K0
RecyclerView的左滑实现
golang刷leetcode 二叉树(5)右视图
给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
golangLeetcode
2022/08/02
2040
左式堆左式堆代码实现
左式堆 性质 零路径长 零路径长的定义为: 零路径长:从节点X到一个没有两个子节点的(有一个子节点或没有子节点)节点的最短距离 对于零路径长,有以下递归的计算方法: 每个节点的零路径长比子节点的最小零路径长大1 NULL的节点的零路径长为-1,只有一个子节点或没有子节点的节点零路径长为0 左式堆 左式堆是特殊的优先堆,除了有序性(每个节点的数据小于其子节点)以外,还有具有与零路径长相关的性质:对于左式堆,要求任一节点的左子节点零路径长大于等于右子节点的零路径长 操作 合并操作 左式堆的基本操作是合并,
月见樽
2018/04/27
9560
左式堆左式堆代码实现
二叉树:做了这么多题目了,我的左叶子之和是多少?
其实题目说的也很清晰了,左和叶子我们都知道表示什么,那么左叶子也应该知道了,但为了大家不会疑惑,我还是来给出左叶子的明确定义:「如果左节点不为空,且左节点没有左右孩子,那么这个节点就是左叶子」
代码随想录
2020/10/10
7150
二叉树:做了这么多题目了,我的左叶子之和是多少?
图解LeetCode第 199 号问题:二叉树的右视图
该文已加入开源项目:LeetCodeAnimation(用动画的形式呈现解LeetCode题目的思路,目前 5500 Star )。地址:https://github.com/MisterBooo/L
五分钟学算法
2018/12/25
5070

相似问题

打印出二叉树的左视图

20

左平衡二叉树

46

左关联二叉树折叠

13

打印二叉树左视图的JavaScript实现返回不正确的结果

214

二叉树上的左-右BFS列

32
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文