编写一个递归算法,实现将一棵二叉树的左右孩子互换。

来源:互联网 发布:linux终端退出服务器 编辑:程序博客网 时间:2024/05/23 12:03
#include "iostream"using namespace std;#define max 20//定义树的结点数typedef struct BTNode//定义二叉树结点类型{char data;//结点数据类型struct BTNode *lc,*rc;//左右指针}BTree;BTree  *createtree(char *str,int i,int m)//将字符串str中第i到第m个字符创建树{BTree *p;if(i >= m)return 0;p = (BTree*)malloc(sizeof(BTree));//生成新结点p->data = str[i];//将结点的第一个数据赋给根p->lc = createtree(str,2*i+1,m);//创建左子树p->rc = createtree(str,2*i+2,m);//创建右子树return (p);}BTree *Exchange(BTree *p)//将p指针指向的二叉树的左右子树进行互换。{BTree *stack[max];//指针类型的堆栈int k = 0;stack[k] = 0;if(p != NULL)//交换p结点的左右孩子{k++;stack[k] = p->lc;p->lc = p->rc;p->rc = stack[k];p->lc = Exchange(p->lc);p->rc = Exchange(p->rc);}return(p);}void PreOrder(BTree *t)//先序遍历{if(t != NULL){cout<<t->data;if(t->lc){cout<<"->";PreOrder(t->lc);}if(t->rc){cout<<"->";PreOrder(t->rc);}}}int main(){int i,n;char str[max];BTree *root;//二叉树根结点的指针cout<<"请输入结点数目n:";cin>>n;cout<<endl;cout<<"请输入"<<n<<"个结点:";for(i = 0;i < n;i++)cin>>str[i];root = createtree(str,0,n);  //创建树cout<<"交换前树的先序遍历:";PreOrder(root);cout<<endl;root = Exchange(root);//交换左右子树PreOrder(root);cout<<"交换后树的先序遍历:";system("pause");}