ProDeveloperTutorial.com

教程和编程解决方案
菜单
  • Shell脚本
  • 系统设计
  • Linux系统编程
  • 4g LTE
  • 编码问题
  • C
  • C ++
  • DSA
  • GIT

二叉树的左视图和右视图

前开发者教程 2020年3月30日

问题陈述:

给定一棵二叉树,请打印树的左右视图。

 

例如:

 

如果您有一棵树,如下所示:

二叉树的左视图和右视图

 

左视图为a,b,d,h,右视图为a,c,g,j。如下图突出显示。

二叉树的左视图和右视图

 

那么我们如何解决这个问题呢?

 

我们可以通过2个步骤轻松解决

 

  1. 获取级别顺序遍历
  2. 所有级别顺序遍历的起始节点均为左视图
  3. 每个级别的结束节点将是正确的视图。

 

步骤1:上述二叉树的层级顺序遍历为:

一种,

b,c

d,e,f,g

h,我,j

 

对于左视图,获取每个级别的第一个节点:

a,b,d,h

 

为了获得正确的视图,请获取每个级别的最后一个节点

a,c,g,j

 

因此,解决方案。

如何以编程方式进行?

要打印二叉树的左视图,请看下面的代码片段:

int max_level = 0;
  
void print_left_view(Node *node, int level) 
{
    if(node == NULL) 
    {
      return;
    }
    
    if(level >= max_level) 
    {
      cout<<node->data << " ";
      max_level++;
    }
    
    print_left_view(node->left, level + 1);
    print_left_view(node->right, level + 1);
}

在这里,我们采取了“max_level”变量并将其设置为0。

每当级别大于等于max_level时,我们都会打印节点数据。因此打印左视图。

例如:

如果我们只有1个节点,如下所示:

二元树

因此,最初,level将为0,max_level也将为0。因此,我们打印根节点。

如果我们有如下所示的二叉树:

二元树

因此,最初,level将为0,max_level也将为0。因此,我们打印根节点并增加max_level。现在max_level将为1。

然后我们去左边的节点,我们递归地调用“print_left_view”与左节点,并提高水平。现在级别将为1。

现在再次使level和max_level匹配,我们打印左侧节点。

当到达正确的节点时,我们递归调用“print_left_view”与正确的节点,并提高水平。现在级别将为2。

但是max_level为1,条件将无法满足,因此不会打印正确的节点。

我们对右视图执行相同的操作。但是这里我们将首先调用右节点,而不是调用左节点。

 

C ++解决方案

#include <iostream>
#include <queue>
#include <stack>
using namespace std;

// structure to hold binary tree node
struct Node
{
    int data;
    Node *left, *right;

    Node(int data)
    {
        this->data = data;
        this->left = this->right = nullptr;
    }
};


int max_level_left = 0;
  
void print_left_view(Node *node, int level) 
{
    if(node == NULL) 
    {
      return;
    }
    
    if(level >= max_level_left) 
    {
      cout<<node->data << " ";
      max_level_left++;
    }
    
    print_left_view(node->left, level + 1);
    print_left_view(node->right, level + 1);
}

int max_level_right = 0;

void print_right_view(Node *node, int level) 
{

    if(node == NULL) 
    {
      return;
    }
    
    if(level >= max_level_right) 
    {
      cout<<node->data << " ";
      max_level_right++;
    }
    
    print_right_view(node->right, level + 1);
    print_right_view(node->left, level + 1);
}



int main()  
{  
    Node* root = nullptr;
    /* Binary tree:
              16
            /   \
           /     \
          10      25
         /  \    /  \
        /    \  /    \
       7    15 18     30

    */

    root = new Node(16);
    root->left = new Node(10);
    root->right = new Node(25);
    root->left->left = new Node(7);
    root->left->right = new Node(15);
    root->right->left = new Node(18);
    root->right->right = new Node(30);

    cout<<"Left view = " ; print_left_view(root, 0); cout<<endl; 
    cout<<"Right view = " ; print_right_view(root, 0); cout<<endl; 

    return 0;  
}

输出:

Left view = 16 10 7
Right view = 16 25 30

 

该网站上可用的教程列表:

C编程20+章C ++编程80+章
100多个编码问题数据结构和算法85+章
系统设计20+章Shell脚本编写12章
4g LTE 60+章节最常见的编码问题
5G NR 50+章Linux系统编程20+章
分享
电子邮件
鸣叫
领英
Reddit
绊倒
Pinterest的
上一篇文章
下一篇

关于作者

前开发者教程

每天我们都会讨论竞争性编程问题,请加入我们的网站:   电报频道

ProDeveloperTutorial.com

教程和编程解决方案
版权© 2020 ProDeveloperTutorial.com
从以下课程获得热门课程: 教育性的


  • <figcaption class="nd8Lqel"></figcaption>

      <td class="IKNzp7P"><time id="MApo4LT"><hr class="u8OjJUe"></hr></time></td>



        • <del class="hfT6JRU"></del>