#includeusing namespace std; typedef struct BiNode { int data; //本次采用整数 struct BiNode* lchild, * rchild; //左孩子 右孩子 } BiNode, * BiTree; //先序遍历 void Xianxu(BiTree T) { if (T) { cout << T->data; Xianxu(T->lchild); Xianxu(T->rchild); } } //中序遍历 void Zhongxu(BiTree T) { if (T) { Zhongxu(T->lchild); cout << T->data; Zhongxu(T->rchild); } } //后序遍历 void Houxu(BiTree T) { if (T) { Houxu(T->lchild); Houxu(T->rchild); cout << T->data; } } //创建二叉树 void CreateBiTree(BiTree& T) { int ch; cin >> ch; if (ch == 0)//终止标志 T = NULL; else { T = new BiNode; T->data = ch;//先序储存 CreateBiTree(T->lchild); CreateBiTree(T->rchild); } } //交换节点 void swap( BiNode* &T1,BiNode* &T2 ) { BiNode* temp; temp = T1; T1 = T2; T2 = temp; } //交换每一个节点 void exchange(BiTree& T) { //要考虑到左右孩子为空的情况 if (T != NULL)//递归终止条件 { if (T->lchild != NULL && T->rchild != NULL) { swap(T->lchild, T->rchild); } else if (T->lchild != NULL && T->rchild == NULL) { T->rchild = T->lchild; T->lchild = NULL; } else if (T->lchild == NULL && T->rchild != NULL) { T->lchild = T->rchild; T->rchild = NULL; } else if (T->lchild == NULL && T->rchild == NULL) { cout << "左右孩子均为空,不交换。" << endl; } exchange(T->lchild); exchange(T->rchild);//先序交换 } else { cout << "--------" << endl; } } int main() { BiTree T;//创建一颗二叉树 cout << "请输入根节点的值(以0为结束标志):"; CreateBiTree(T); cout << "二叉树构建完毕!" << endl; cout << "先序遍历输出: "; Xianxu(T); cout << endl; cout << "中序遍历输出: "; Zhongxu(T); cout << endl; cout << "后序遍历输出"; Houxu(T); cout << endl; cout << "三种遍历完毕!" << endl; cout << "交换每个子节点" << endl; exchange(T); cout << "再次进行三种遍历!" << endl; cout << "先序遍历输出: "; Xianxu(T); cout << endl; cout << "中序遍历输出: "; Zhongxu(T); cout << endl; cout << "后序遍历输出"; Houxu(T); cout << endl; cout << "遍历完毕!" << endl; system("pause"); return 0; }
实现思路:
- 首先定义出一个二叉树单元的结构,内部有 整形和左右孩子的指针。
- 二叉树的创建,同样是先序访问的思想,先将data赋值,然后递归调用左孩子右孩子,要设立递归终止条件(本题采用0为终止标志)。
- 先序中序后序的差别在于,访问的顺序,其中左右子树的顺序是一致的,访问在100,则先序,访问在010,则中序,访问在001,则后序。
- 交换的时候要注意左右子树是否为空的情况,并且用if-else语句来判断



