交换二叉树的所有节点的左右子树算法(C语言)

如题所述

二叉树最好使用递归的算法,假设二叉树节点定义如下:
typedef struct node{
int a;
node* left;
node* right;
};
可以定义交换左右子树的函数如下:
void changeleaf(node* anode)
{
if(anode!=0)
{
node* tnode=anode->left;
anode->left=anode->right;
anode->right=tnode;
changeleaf(anode->left);
changeleaf(anode->right);
}
};
温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2016-09-27
递归的交换就可以了。
struct Node
{
int value;
Node * left;
Node * right;
};

void exchange(Node * node)
{
if(node == NULL) return;
Node * temp = node->left;
node->left = node->right;
node->right = temp;

exchange(node->left);
exchange(node->right);
}本回答被提问者和网友采纳
第2个回答  推荐于2017-09-29
#include<stdio.h>
#include<malloc.h>
typedef struct binode{
int data;
struct binode *lchild,*rchild;
}binode,*bitree;
typedef struct{
bitree elem[100];
int top;
}stack;
bitree creat_bt(){ //按扩展前序建二叉树
bitree t;int x;
scanf("%d",&x);
if (x==0) t=NULL;
else { t=(bitree)malloc(sizeof(binode));
t->data=x;
t->lchild=creat_bt();
t->rchild=creat_bt();
}
return t;
}
void exchange(bitree t) //左、右子树交换
{bitree p;
if(t!=NULL)
{ p=t->lchild;t->lchild=t->rchild;
t->rchild=p;
exchange(t->lchild);
exchange(t->rchild);
}
}
void inorder(bitree bt) //递归的中序遍历
{ if (bt){
inorder(bt->lchild);
printf("% d",bt->data);
inorder(bt->rchild);
}
}
main()
{bitree root;
printf("\n");
printf("建二叉树,输入元素:");
root=creat_bt(); /*create tree of useing preorder*/
printf("交换前的中序序列是:");
inorder(root);
exchange(root);
printf("\n交换后的中序序列是:");
inorder(root);
printf("\n");
}
第3个回答  2020-07-06
void Bitree_Revolute(BiTree b){
if(b){ //结点非空
Bitree_Revolute(b->lchild); //递归左子树

Bitree_Revolute(b->rchild);//递归右子树

Bitree temp = b->lchild; //结点类型设为Bitree,交换左右节点

b->lchild = b->rchild;

b->rchild = temp;

}
}

交换二叉树的所有节点的左右子树算法(C语言)
二叉树最好使用递归的算法,假设二叉树节点定义如下:typedef struct node{ int a;node* left;node* right;};可以定义交换左右子树的函数如下:void changeleaf(node* anode){ if(anode!=0){ node* tnode=anode->left;anode->left=anode->right;anode->right=tnode;changeleaf(anode->left);cha...

...试写出算法(C函数):将所有结点的左右子树互换。
(1) 为空二叉树 (2)只有一个根结点的二叉树 (3)右子树为空的二叉树 (4)左子树为空的二叉树 (5)完全二叉树 二叉树的基本操作:(1)INITIATE(BT ) 初始化操作。置 BT为空树。(2)ROOT(BT)\\ROOT(x) 求根函数。求二叉树 BT的根结点或求结点 x所在二叉树的根结点。若 BT是空...

若二叉树采用二叉链表存储结构,要交换其所有分支结点左、右子树的位置...
【答案】:C 本题用后序遍历肯定没问题,不过用层次遍历也可以实现,所以选D也不能算错,相比之下,后序遍历实现的程序更容易理解,作为单项选择题,首选的应该是C。

交换二叉树左右子树用什么遍历比较好
2、广度优先遍历(BFS):是一种用于遍历或搜索树或图的算法。这个算法从根开始访问树的节点,然后逐层向下,每层从左到右进行访问。如果二叉树非连通,则无法访问到所有节点。

若二叉树采用二叉链表存储结构,要交换其所有分支结点左、右子树的位置...
答案:C。用二叉链表存储结构也就是左孩子右兄弟的存储结构。后序遍历比较合理。正常的逻辑应该就是:做好当前结点子树内部的交换,然后交换当前结点的左右子树。刚好符合后序遍历的算法逻辑。1、交换好左子树 2、交换好右子树 3、交换左子树与右子树 其他算法如先序和按层次其逻辑都差不多,即访问当前...

写一个算法,交换一棵二叉树T的左右子树,要求使左子树根结点的关键字k小...
\/\/递归算法(更像伪代码)void swap(BT root){ if(root){ if(root.l&&root.r&&(*root.l).key>(*root.r).key){ BT p=(*root).l;(*root).l=(*root).r;(*root).r=p;} swap((*root).l);swap((*root).r);} }

c语言二叉树问题,勿写代码,求详细思考过程
中序遍历:若树不空,则先访问左子树,再访问根,再访问右子树。从后序遍历:CDABE得出E是最顶根节点。然后中序遍历:CADEB得出CAD是E的左子树中的,B是E的右子树中的。再分析后序遍历CDA可以知道A是CD的根,而中序是CAD得到C是A的左子树,D是A的右子树。(如下图)最后,先序遍历:若树...

如何判断二叉排序树的左右子树?
右子树、根结点的顺序。后序结果中A最后访问,所以A是根结点,结合中序结果可知,BDCE则都在二叉树的左边。后序结果中DECB最后访问B,则B就是A的左子树;中序最先访问B,说明B没有左子树,只有右子树……总之结合中后序遍历的结果,依次递推即可得到如图的答案。 不懂的可以再问我。

...1.计算二叉树叶子节点的个数。2.交换二叉树所有孩子节点的左...
即完成了交换。首先掌握前序遍历和中序遍历的思想方法,根据这个判断出树是很好办,首先你可以根据前序建立一个树,然后当遇到不确定此结点是左子树还是右子树的时候使用中序的顺序进行确定。循环此算法即可得到该树。树的数据结构是递推的,所以解决此类问题,要有递归思想,你对递归理解的越透彻,解决...

什么是二叉树的左子树和右子树?
左子树就是以当前节点看,它的左子节点那一分支的子树,该子树以当前节点左子节点为根。右子树就是以当前节点看,它的右子节点那一分支的子树,该子树以当前节点右子节点为根。左右子树只在二叉树中有意义,因为二叉树非左即右。二叉树是指,一棵树的每个节点,最多有2个子节点的树 ,即每个节点...

相似回答