交换二叉树的左右子树
二叉树

编写算法,要求实现以下功能:
(1)写一个建立二叉树的算法,要求二叉树按照二叉链表存储;
(2)已知二叉树用二叉链表存储,要求写出算法,实现将该二叉树左右子树交换。

这是西北大学考研试题。例如,一颗二叉树在左右子树交换前后的情况如下图所示。

树7——交换二叉树的左右子树


这是西北大学考研试题。本题考查二叉树的建立算法思想和左右子树交换算法思想。左右子树交换可用递归实现,类似二叉树的先序遍历算法,通过对先序遍历算法改进就可以将左右子树交换。从根结点开始,先交换根结点的左右两棵子树的指针,然后分别递归调用左右两棵子树,对子树的各个结点的左右两个指针,这样就完成了两棵子树的交换。

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");
}

结果:

树7——交换二叉树的左右子树

 

相关文章:

  • 2022-12-23
  • 2021-11-10
  • 2022-12-23
  • 2022-12-23
  • 2021-09-02
  • 2022-12-23
  • 2022-01-14
  • 2021-12-02
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2022-01-01
  • 2022-01-17
  • 2021-06-04
  • 2021-11-24
  • 2022-12-23
相关资源
相似解决方案