百练 二叉树的操作(二叉树)

来源:互联网 发布:五山到软件路13 编辑:程序博客网 时间:2024/06/14 01:24

二叉树的操作

  • 查看
  • 提交
  • 统计
  • 提问
总时间限制: 
1000ms 
内存限制: 
65535kB
描述

给定一棵二叉树,在二叉树上执行两个操作:
1. 节点交换
把二叉树的两个节点交换。

2. 前驱询问
询问二叉树的一个节点对应的子树最左边的节点。

输入
第一行输出一个整数t(t <= 100),代表测试数据的组数。

对于每组测试数据,第一行输入两个整数n m,n代表二叉树节点的个数,m代表操作的次数。

随后输入n行,每行包含3个整数X Y Z,对应二叉树一个节点的信息。X表示节点的标识,Y表示其左孩子的标识,Z表示其右孩子的标识。

再输入m行,每行对应一次操作。每次操作首先输入一个整数type。

当type=1,节点交换操作,后面跟着输入两个整数x y,表示将标识为x的节点与标识为y的节点交换。输入保证对应的节点不是祖先关系。

当type=2,前驱询问操作,后面跟着输入一个整数x,表示询问标识为x的节点对应子树最左的孩子。

1<=n<=100,节点的标识从0到n-1,根节点始终是0.
m<=100
输出
对于每次询问操作,输出相应的结果。
样例输入
25 50 1 21 -1 -12 3 43 -1 -14 -1 -12 01 1 22 01 3 42 23 20 1 21 -1 -12 -1 -11 1 22 0
样例输出
1342
二叉树:
操作1:翻转的是两个子树,而不是单纯的两个结点。这样其实更好实现。只要找到两个结点的父亲结点
并且弄明白分明是在父节点的左分支还有右分支即可。
2.打印最左边的结点。递归即可
#include<iostream>#include<cstring>#include<string>using namespace std; int t[444][2];int n,m;void print(int x){if(t[x][0]==-1){cout<<x<<endl;;return;}print(t[x][0]); }  int flag1,flag2; //找到他爹并弄清楚是左子树还是右子树  //flag1代表第一个元素的爹以及左右子树,flag2代表第二个 void fun(int x,int a,int b){if(x==-1)return;if(t[x][0]==a){flag1=x*n+0;} if(t[x][1]==a){flag1=x*n+1;}if(t[x][0]==b){flag2=x*n+0;} if(t[x][1]==b){flag2=x*n+1;}fun(t[x][0],a,b);fun(t[x][1],a,b);}int main(){int tt;cin>>tt;while(tt--){cin>>n>>m;for(int i=1;i<=n;i++){int x,y,z;cin>>x>>y>>z;t[x][0]=y;t[x][1]=z;}for(int i=1;i<=m;i++){int x;cin>>x;if(x==1){int y,z;cin>>y>>z; fun(0,y,z);//cout<<endl<<flag1/n<<" "<<flag1%n<<" "<<flag2/n<<" "<<flag2%n<<endl<<endl;swap(t[flag1/n][flag1%n],t[flag2/n][flag2%n]);flag1=flag2=0;}else {int x;cin>>x;print(x);}}}return 0; } 


原创粉丝点击