二叉树左右子树的交换并显示(C++实现)

二叉树左右子树的交换并显示(C++实现)实现二叉树的左右子树交换并显示_树交换左右子数

文章目录

一、功能介绍

1、将指定结点的左右子树进行交换(默认为根结点)

2、从根结点开始将所有结点的左右子树进行交换

二、代码分析

1、二叉树结点结构

struct BinaryTree {
	char data;
	struct BinaryTree *left, *right;
};

使用char数据类型作为二叉树结点储存的数据的数据类型,左右子树均使用二叉树结点的指针指代。

2、随机生成数据

// 随机生成数据部分(范围大小写英文字母以及 0~9 的 10 个数字) 
char randomChar() {
	char data = rand() % 128;
	if (!(data >= '0' && data <= '9' || data >= 'A' && data <= 'Z' || data >= 'a' && data <= 'z')) {
		return randomChar();
	}
	else
	return data; 
}

// 随机生成二叉树 
int nodeNumber = 0; 
BinaryTree* randomCreate() {
	char x = randomChar();
	// cout << x << endl;
	BinaryTree *node;
	node = (BinaryTree*)malloc(sizeof(BinaryTree));
	node->data = x;
	// 按概率随机生成左右子树是否为空或存在并生成至少 3 个有数据的结 点以及总共 5 个结点
	if (++ nodeNumber <= 5) {
	 	int y = randomChar();
		// 1/6 的概率生成仅右孩子的结点 
		// 1/6 的概率生成仅左孩子的结点
		// 前 3 次 2/3 的概率生成左右孩子都有的结点 
		// 后 n 次 1/3 的概率生成左右孩子都有的结点
		// 后 n 次 1/3 的概率生成子叶结点
		if (y % 6 == 0) {
			node->left = NULL;
			node->right = randomCreate();
		} else if (y % 6 == 1) {
			node->left = randomCreate();
			node->right = NULL;
			} else if (y % 6 == 2 || y % 6 == 3) {
				node->left = randomCreate();
				node->right = randomCreate();
				} else {
					if (nodeNumber <= 3) {
						node->left = randomCreate();
						node->right = randomCreate();
					} else {
						node->left = NULL;
						node->right = NULL;
						} 
					}
	} else {
		// 防止因为左右孩子都未初始化的情况
		node->left = NULL;
		node->right = NULL;
		}
		return node; 
}

利用迭代生成二叉树的每个结点,

时间复杂度:O(N²)≥O(N),N为设置的生成的结点数

空间复杂度:O(N)

3、二叉树的左右子树简单交换

// 仅整个子树交换 
void childChange_simple(BinaryTree *parent) {
	if (parent == NULL) {
		return;
	}
	else {
		BinaryTree *mid;
		mid = parent->left;
		parent->left = parent->right;
		parent->right = mid;
		return;
	}// 仅仅是左右子树的整体交换,并没有将其内部的左右相互交换
}

由于是简单的左右子树交换,并没有改变左右子树内部的结构,因此进行交换操作时,仅交换需要交换的结点的左右子树。

若交换根结点的左右子树:

时间复杂度:O(1)

空间复杂度:O(1)

若交换指定结点的左右子树,需要配合查找函数:

时间复杂度:O(N²),N为现有结点的个数

空间复杂度:O(N+1)

4、二叉树的左右子树迭代交换

// 子树内的每个左右结点都交换 
void childChange_iteration(BinaryTree *parent) {
	if (parent == NULL) {
		return;
	}
	else {
		BinaryTree *mid = parent->left;
		parent->left = parent->right;
		parent->right = mid;
		childChange_iteration(parent->left);
		childChange_iteration(parent->right);
		return;
	}// 利用迭代将左右子树以及其内部的左右结点都进行了交换
}

由于是利用递归函数依次将从指定结点的左右子树进行交换,因此:

时间复杂度:O(N),N为现有结点的个数

空间复杂度:O(H),H为二叉树的高度,由于使用的是递归函数进行交换,而递归函数需要栈空间,栈空间取决于递归深度,即空间复杂度等于高度

5、显示二叉树

// 显示二叉树 
// 按数目输出空格 
void Space(int number) {
	for (int i = 0; i < number; i ++) {
		cout << ' ';
	} 
}

// 输出 
void printBinaryTree(BinaryTree *root) {
	// 第一步:将数据按树的结构顺序存入二维数组中
	int deep = getDeep(root); 
	int length = (int)pow(2, deep - 1); 
	char Btree[deep][length]; 
	int width, row = 1; 
	Btree[0][0] = root->data;
	Btree[0][length - 1] = ' '; 
	queue<BinaryTree*> BTreeQueue; 
	BTreeQueue.push(root); 
	while (!BTreeQueue.empty())

今天的文章二叉树左右子树的交换并显示(C++实现)分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/65882.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注