交换二叉树的左右子树
二叉树
编写算法,要求实现以下功能:
(1)写一个建立二叉树的算法,要求二叉树按照二叉链表存储;
(2)已知二叉树用二叉链表存储,要求写出算法,实现将该二叉树左右子树交换。
这是西北大学考研试题。例如,一颗二叉树在左右子树交换前后的情况如下图所示。
这是西北大学考研试题。本题考查二叉树的建立算法思想和左右子树交换算法思想。左右子树交换可用递归实现,类似二叉树的先序遍历算法,通过对先序遍历算法改进就可以将左右子树交换。从根结点开始,先交换根结点的左右两棵子树的指针,然后分别递归调用左右两棵子树,对子树的各个结点的左右两个指针,这样就完成了两棵子树的交换。
code:
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <iostream>
using namespace std;
#define MAXSIZE 100
typedef struct Node
{
char data;
struct Node *lchild, *rchild;
}BitNode,*BiTree;
void CreateBitTree(BiTree *T, char str[]);
void PrintLevel(BiTree T);
void SwapSubTree(BiTree *T);
void SwapSubTree(BiTree *T)
{
BitNode *temp;
if ((*T))
{
temp = (*T)->lchild;
(*T)->lchild = (*T)->rchild;
(*T)->rchild = temp;
SwapSubTree(&((*T)->lchild));
SwapSubTree(&((*T)->rchild));
}
}
void CreateBitTree(BiTree *T, char str[])
{
char ch;
BiTree stack[MAXSIZE];
int top = -1;
int flag, k;
BitNode *p;
*T = NULL, k = 0;
ch = str[k];
while (ch!='\0')
{
switch (ch)
{
case '(':
stack[++top] = p;
flag = 1;
break;
case ')':
top--;
break;
case ',':
flag = 2;
break;
default:
p = (BiTree)malloc(sizeof(BitNode));
p->data = ch;
p->lchild = NULL;
p->rchild = NULL;
if (*T==NULL)
{
*T = p;
}
else
{
switch (flag)
{
case 1:
stack[top]->lchild = p;
break;
case 2:
stack[top]->rchild = p;
}
}
}
ch = str[++k];
}
}
void TreePrint(BiTree T, int level)
{
int i;
if (T==NULL)
{
return;
}
TreePrint(T->rchild, level + 1);
for (i = 0; i < level;i++)
{
printf(" ");
}
printf("%c\n", T->data);
TreePrint(T->lchild, level + 1);
}
void main()
{
BiTree T;
char str[MAXSIZE];
cout << "请输入二叉树的广义表形式:" << endl;//A(B(D,E),C(F))
cin >> str;
cout << "由广义表形式的字符串构造二叉树:" << endl;
CreateBitTree(&T, str);
cout << endl<< "左右子树交互前的二叉树:" << endl;
TreePrint(T, 1);
SwapSubTree(&T);
cout << endl << "左右子树交互后的二叉树:" << endl;
TreePrint(T, 1);
system("pause");
}
结果: