百练+二叉树操作+直接找到父节点,然后交换左右儿子,递归
2017-09-15 09:41
549 查看
点击打开链接
#include<stdio.h> #include<stdlib.h> #include<iostream> #include<string.h> #include<cstring> #include<string> #include<algorithm> #include<math.h> #include<queue> #include<set> #include<stack> #include<map> #define LL long long #define inf 0x3f3f3f3f using namespace std; int t=0,n=0,m=0,X=0,Y=0,Z=0; int tree[450][2],flag1,flag2; void prin(int x) { if(tree[x][0]==-1){ printf("%d\n",x); return; } prin(tree[x][0]); } void solv(int p,int a,int b) { if(p==-1) return; if(tree[p][0]==a){///左边节点 flag1=p*2+0; } if(tree[p][1]==a){///右边节点 flag1=p*2+1; } if(tree[p][0]==b){///左边节点 flag2=p*2+0; } if(tree[p][1]==b){///右边节点 flag2=p*2+1; } solv(tree[p][0],a,b); solv(tree[p][1],a,b); } int main() { scanf("%d",&t); while(t--){ scanf("%d %d",&n,&m); for(int i=0;i<n;i++){ scanf("%d %d %d",&X,&Y,&Z); tree[X][0]=Y;tree[X][1]=Z; } for(int i=0;i<m;i++){ int x=0,y=0,type=0; scanf("%d",&type); if(type==1){ scanf("%d %d",&x,&y); flag1=0; flag2=0; solv(0,x,y); swap(tree[flag1/2][flag1%2],tree[flag2/2][flag2%2]);///升级到父亲节点,交换左右儿子 } else if(type==2){ scanf("%d",&x); prin(x); } } } return 0; }
相关文章推荐
- 6_43_递归交换二叉树中所有节点的左右子树
- 八.二叉树各种操作的C语言实现 深度遍历求深度,广度遍历求深度,交换左右子树,求叶子节点数
- (10.28)递归建立一个二叉树,交换左右节点,并遍历
- 非递归实现交换二叉树的左右子节点
- 二叉树中所有节点的左右子树相互交换 递归与非递归程序
- 二叉树中所有节点的左右子树相互交换 递归与非递归程序
- [Java]将二叉树的左右子树交换 非递归实现
- 二叉树 遍历|统计叶子节点|求深度|交换左右子树|查找是否存在某个特定叶子节点练习题
- 二叉树的各种操作的(递归非递归)的实现,如(递归非递归)先序后序中序层次遍历 二叉树的高度 叶子节点数,所有节点数
- 交换二叉树左右节点
- PAT ~ L2-011. 玩转二叉树 (树的遍历互求 + 交换左右节点)
- 反转二叉树,即交换所有结点的左右子树,但不能使用递归方法。
- 二叉树递归非递归三序访问,节点数,高度全操作
- [Java]将二叉树的左右子树交换 非递归实现
- 数据结构五:二叉树的递归遍历,二叉树的叶子节点个数,二叉树的拷贝操作基础学习
- 二叉树 前 后 中序遍历, 按层遍历, 求高度, 交换左右儿子等
- 学习笔记—交换二叉树所有节点中的左右子树
- 二叉树的创建,遍历,求高度,算出节点数,算出叶子节点数,左右子树的交换,二叉树的销毁。
- 将一棵二叉树的全部节点的左右子树交换顺序
- 把二叉树中每个节点左右孩子位置交换。