首页 > 编程知识 正文

二叉树右视图思路java,二叉树的左视图

时间:2023-05-04 01:20:50 阅读:146556 作者:2466

用美丽的姿态看树(翻转二叉树的二叉树左右视图)题目描述

这一天美丽的身影放学后回家没带钥匙,无聊的他只能在楼下走来走去。

那时,他注意到楼下种了二叉树。 他绕二叉树转了几圈,发现二叉树从左边看到的数字和从右边看到的数字不同。

在图中的二叉树中,他可以从左边看到8 6 4 2 7,从右边看到8 5 1 2 7。

这让人思考,如果将各节点左右的孩子交换位置,从左边看到的数字和从右边看到的数字会有什么变化。

请帮助美丽的身影解决这个难题。

输入描述

第1行给出的正整数n(1n10^3)和正整数x(1xn )分别表示原始二叉树的节点数和根节点号。

接下来n行按照1 ~ n的顺序给出原始树的节点编号ai、节点左子编号bi和右子编号ci(1AI、bi、cin ),

没有左边或右边孩子的位置用-1代替。

输出描述

输出第2行,第1行变了,美丽的身影从左边看到的数字,第2行美丽的身影从右边看到的数字,

数字的顺序从上到下,两个数字用空格分隔。

实例1

输入

8 8

1-1

2 -1 7

3 -1 -1

4 -1 -1

5 -1 1

6 4 3

7 -1 -1

8 6 5

输出

8 5 1 2 7

8 6 4 2 7

题目要求反转二叉树,然后求出二叉树的左视图和右视图。

分别容纳二叉树各层次的节点。 二叉树的左侧视图是每个层次结构中最左侧的节点,右侧视图是每个层次结构中最右侧的节点。

先种树。 主题是各节点左右的孩子交换位置。 做好树后可以翻转二叉树。

treeinverttree(treenode )//二叉树if ) node==null ) {return NULL; }树temp=node-l; 节点- l=节点- r; 节点- r=temp; 反向树(节点- l; 反向树(节点- r ); 返回节点; }关于正题,读取时将左边的孩子读为右边的孩子,右边的孩子读为左边的孩子很简单。

for(intI=0; i n; I ) )//种树,左右儿童更换int a、b、c; cin a b c; if(b!=-1 ) tree[a]-r=tree[b]; if(c!=-1 )树[ a ]-l=tree [ c ]; }其次,需要对二叉树进行分层扫描。 我们必须知道二叉树节点的深度才能知道节点在几楼,所以我们可以

将名为深度deep的属性添加到节点结构中:

类型结构节点{ int n,deep; //deep是节点深度,默认为1结构节点* l、*r; 节点() {deep=1; l=NULL; r=空值; } } *树; 通过分层遍历添加到队列中的新deep与父节点的deep 1:相同

语音级别(树)//电平遍历队列树qu; qu.push(t; while(qu.size )0) {Tree top=qu.front; vt[top-deep].push_back(top-n ); //记录各层的节点MX=max(MX,top-deep )//记录最大深度if(top-L!=null}{top-l-deep=top-deep1; //节点深度为父节点深度1qu.push(top-L ); (if )顶级r!=空值(top-r-deep=top-deep 1; qu.push (顶部- r ); (}qu.pop ); }知道每个节点的深度后,可以根据深度将层次遍历中深度相同的节点放置在相同的vector[deep]中,并记录出现的最大深度mx。 为了求出左侧视图,从浅向深输出vector[1 ~ mx]各层的最初编号即可,右侧的视图也同样地从浅向深输出vector[1 ~ mx]即可

AC代码:

# include bits/stdc.husingnamespacestd; 类型结构节点{ int n,deep; //deep是节点深度,默认为1结构节点* l、*r; 节点() {deep=1; l=NULL; r=空值; } } *树; 树树[ 1005 ]; vectorint vt[1005] //深度为1到n的节点int mx=-0x3f3f3f3f; //记录最大深度voidlevel(treet )//级别,遍历队列树qu; qu.push(t; while(qu.size )0) {Tree top=qu.front; vt[top-deep].push_back(top-n ); //记录各层的节点MX=max(MX,top-deep )//记录最大深度if(top-L!=null}{top-l-deep=top-deep1; //节点深度为父节点深度1qu.push(top-l ); (if )顶级r!=空值(top-r-deep=top-deep 1; qu.push (顶部- r ); (}qu.pop ); }}int main () {int n,x; cin n x; for(intI=1; i=n; I () /初始化节点数组tree[i]=new node; 树[ I ]-n=I; }for(intI=0; i n; I ) )//种树,左右儿童更换int a、b、c; cin a b c; if(b!=-1 ) tree[a]-r=tree[b]; if(c!=-1 )树[ a ]-l=tree [ c ]; }level(tree[x]; //从树根x分层遍历for (inti=1; i=mx; I ) cout vt[i][0] '; //每层的最左节点cout 'n '; for(intI=1; i=mx; I ) cout vt[i][vt[i].size ()-1 ) '; //每层的最右节点cout 'n '; 返回0; }

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。