设一棵二叉树以二叉链表为储存结构,设计一个递归算法将所有结点的左右子树互换

大哥,大姐帮帮忙啊!!!设一棵二叉树以二叉链表为储存结构,设计一个递归算法将所有结点的左右子树互换,小弟不胜感激!!!

//我做了一个程序,可以实现二叉树的左右子树的交换功能,#include<iostream.h>/* 二叉树类型的定义(二叉链表形式储存) */
typedef char datatype; // 树的结点数据类型为字符型,可以根据需要修改
typedef struct node *pointer; // 定义二叉树结点类型
struct node {
datatype data; //结点数据
pointer lchild,rchild; //左右孩子结点
};
typedef pointer bitree; //定义二叉树类型
/* 先根遍历交换左右子树 *//* 层次遍历序列生成 */
const int maxsize=100;
pointer Q[maxsize+1];
bitree level_creat() //由层次序列建立二叉树,返回根指针
{
char ch;
int front,rear;
pointer root,s;
root=NULL; //置空二叉树
front=rear=0; //置空队列
while(cin>>ch,ch!='#')
{
if(ch!='@') //非虚结点,建立新结点
{
s=new node;
s->data=ch;
s->lchild=s->rchild=NULL;
}
else s=NULL;
rear++;
Q[rear]=s; //不管结点是否为虚都要入队
if(rear==1) { root=s; front=1; } //第一个点是根,要修改头指针,他不是孩子
else if(s && Q[front]) //孩子和双亲都不是虚结点
if(rear%2==0) Q[front]->lchild=s; // rear是偶数,新结点是左孩子
else
{
Q[front]->rchild=s; //rear 是奇数,新结点是右孩子
front++;
}
}
return root;
}

/* 交换左右子数 */
void exchange(bitree t)
{
pointer p;
if(t==NULL) return; //空树,直接返回
p=t->lchild; t->lchild=t->rchild; t->rchild=p; //交换
exchange(t->rchild); //遍历原左子树
exchange(t->lchild); //遍历原右子树
}/* 二叉树的先根遍历 */
void preorder(bitree t) //先根遍历
{
if(t==NULL) return;
cout<<t->data<<" "; //先访问跟
preorder(t->lchild); //先根遍历左子树
preorder(t->rchild); //先根遍历右子树
}void main()
{
bitree T=NULL; int ch;
cout<<"首先层次遍历序列生成二叉树,请输入结点数据(输入'@'为虚结点,输入'#'结束):\n";
T=level_creat();
if(T==NULL) cout<<"二叉树生成失败!\n";
else cout<<"二叉树生成成功!\n";
AA: do{
cout<<" ----------------------菜单--------------------\n"
<<" 0.退出\n"
<<" 1.重新建立二叉树\n"
<<" 2.交换左右子数\n"
<<" 3.先根遍历二叉树\n"
<<" 请选择:\n"
<<" ----------------------------------------------\n";
cin>>ch;
switch(ch)
{
case 0: break;
case 1: T=level_creat(); cout<<"二叉树生成成功!\n"; break;
case 2: exchange(T); cout<<" 交换成功!\n"; break;
case 3: preorder(T); cout<<endl; break;
default: cout<<"您输入错误!请重新输入"; goto AA;
}
}while(ch!=0);
}
温馨提示:内容为网友见解,仅供参考
无其他回答

谁有数据结构的期末试题,借我参考下马上考试了
2.设一棵二叉树以二叉链表为存贮结构,设计一个算法将二叉树中所有结点的左,右子树相互交换。要求给出二叉链表的类型定义。(8分)答案:06-07第一学期期末考试参考答案与评分标准 试卷代码:03266B 授课课时:112课程名称:数据结构与算法 适用对象:本科 一、单项选择题(每小题2分,共24分。) 1. B 2. C 3. ...

...试写出算法(C函数):将所有结点的左右子树互换。
若结点 x是根结点或不在 BT中或是其双亲的左 \/右子树根 ,则函树值 为 “空 ”。(6)CRT_BT(x,LBT,RBT) 建树操作。生成一棵以结点 x为根,二叉树 LBT和 RBT分别为左, 右子树的二叉树。(7)INS_LCHILD(BT,y,x) 和 INS_RCHILD(BT,x) 插入子树操作。将以结点 x为根且右子树为空的...

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

若二叉树采用二叉链表存储结构,要交换其所有分支结点左、右子树的位置...
1. 根结点入队列 2. 出队列,交换其左右子树,将子树的根入队列 3. 重复2直到队列为空 中序遍历相对较难实现一些。

假设二叉树以二叉链表作为存储结构,试设计一个计算二叉树叶子结点树的...
叶子节点:没有孩子节点的节点 下面我给出两种求解思路,其中就包括你要的递归求解。Java版的示例代码如下:package cn.zifangsky.tree.binarytree.questions;import org.junit.Test;import cn.zifangsky.queue.LinkQueue;import cn.zifangsky.tree.binarytree.BinaryTreeNode;\/** * 求二叉树中叶子节点的个...

假设二叉树以二叉链表作为存储结构,试设计一个计算二叉树叶子结点树的...
1、首先要定义两个类:结点类和二叉树类。2、二叉树类的组成:建立树的函数、遍历函数、删除函数。求结点数函数。3、采用递归的思想,遇到标识符表示该结点为空,否则开辟空间创建新结点,同时调用递归开辟左结点和右结点。4、前序遍历函数。5、删除函数的思路:如果当前结点不为空,采用递归访问左结点...

已知一棵二叉树以二叉链表为存储结构,编写如下程序:对于树中每一个元 ...
先前序遍历整个二叉树,找到符合要求的结点,然后后序遍历该结点的整个子树,逐一释放结点。\/\/假设二叉树结构体如下struct binTree{ int data; binTree *lchild; binTree *rchild;}*BiTree;\/\/函数如下BiTree find(BiTree node, int x){ if(node) { if(node->data==x) dele...

假设二叉树采用二叉链表作为存储结构,试编写一个算法:求任意一个指定结...
非递归中序遍历 构造变量count记录当前层访问到的节点数,nextcount记录当前层的总个数;每当访问过一层层数depth++;此种方法同时可以求最大宽度,访问第几层的第几个节点,求带权路径长度WPL,是一种通用方法!int TreeDepth(TreeNode* pRoot){queueq;q.push(pRoot);if(pRoot==NULL)return 0;...

设二叉树的存储结构为二叉链表,编写有关二叉树的递归算法:
int Degree1;int Degree2;int Depth;} Answear;BiTree* CreateTree(int n){ BiTree *t;if (n <= 0 || n> NUM_NODE) return NULL;if (!(t = (BiTree*)malloc(sizeof(BiTree)))return NULL;t->data = n;printf("%d ", t->data);t->lchild = CreateTree(2*n);t->rchild ...

...树是否为二叉排序树的算法,设此二叉树以二叉链表作存储结构...
用递归:a=当前节点是否为排序树,是为1,不是为0 f(x)=1 当x为叶节点 f(x)= a&&f(x->lchid)&&f(x-rchild) 当x非叶节点 --- int IsAVTree(BiTree t){ int a=1;if(t->Child==NULL&&t->Rchild==NULL) return 1; \/\/叶子节点判断 if((t->Lchild->data>t->data)||...

相似回答