交换二叉树的所有左右子树并遍历输出

在这里插入图片描述

#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;
}

在这里插入图片描述

发布了60 篇原创文章 · 获赞 6 · 访问量 7760

猜你喜欢

转载自blog.csdn.net/qq_44205272/article/details/103438709