#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
typedef struct node
{
char data; // 节点数据
struct node *left, *right; // 左,右节点
}*Node;
node *input() // 使用前序遍历的方法建立一棵二叉树
{
node *p;
char c;
scanf_s("%c", &c);
if (c == '#') // 如果输入是#号,表示是一棵空树
{
p = NULL;
}
else
{
p = (struct node *)malloc(sizeof(node));
p->data = c;
p->left = input();
p->right = input();
}
return p;
}
void PreOrder(Node t) // 非递归前序遍历
{
Node stack[MAXSIZE]; // 栈数组
int top = -1; // 标识符
while (t || top != -1)
{
while (t)
{
printf("%c ", t->data);
top++;
stack[top] = t; // 入栈
t = t->left; // 判断左节点是否为空
}
if (top > -1)
{
t = stack[top]; // 把栈顶的值赋给t
top--; // 因为栈顶已经输出过,出栈
t = t->right;
}
}
}
void preorder(Node t) // 递归前序遍历
{
if (t)
{
printf("%c ", t->data);
preorder(t->left);
preorder(t->right);
}
}
void exchange(Node t)
{
if (t->left == NULL && t->right == NULL)
;
else // 可能有三种情况,都不为空,左为空,右为空
{
// 交换左右子树
Node temp = t->left;
t->left = t->right;
t->right = temp;
}
// 如果交换后的这个结点左子树不为空,则继续向下寻找可以交换的结点
if (t->left)
exchange(t->left);
if (t->right)
exchange(t->right);
}
void exchange_preorder(Node t) // 递归前序遍历输出交换后的二叉树
{
if (t)
{
printf("%c ", t->data);
preorder(t->left);
preorder(t->right);
}
}
int main()
{
node *p;
p = (struct node *)malloc(sizeof(node));
p = input();
printf("非递归前序遍历:");
PreOrder(p);
printf("\n");
printf("递归前序遍历:");
preorder(p);
printf("\n");
// 交换左右子树
exchange(p);
printf("交换后前序输出:");
exchange_preorder(p);
printf("\n");
system("pause");
return 0;
}
交换二叉树的所有左右子树并遍历输出
猜你喜欢
转载自blog.csdn.net/qq_44205272/article/details/103438709
今日推荐
周排行