用美丽的姿态看树(翻转二叉树的二叉树左右视图)题目描述
这一天美丽的身影放学后回家没带钥匙,无聊的他只能在楼下走来走去。
那时,他注意到楼下种了二叉树。 他绕二叉树转了几圈,发现二叉树从左边看到的数字和从右边看到的数字不同。
在图中的二叉树中,他可以从左边看到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; }