问题陈述:
给定一棵二叉树,请打印树的左右视图。
例如:
如果您有一棵树,如下所示:
左视图为a,b,d,h,右视图为a,c,g,j。如下图突出显示。
那么我们如何解决这个问题呢?
我们可以通过2个步骤轻松解决
- 获取级别顺序遍历
- 所有级别顺序遍历的起始节点均为左视图
- 每个级别的结束节点将是正确的视图。
步骤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+章 |