二叉树问题——7-5 交换二叉树中每个结点的左孩子和右孩子(25 分)

287 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第25天,点击查看活动详情

题目描述:

以二叉链表作为二叉树的存储结构,交换二叉树中每个结点的左孩子和右孩子。

输入格式:

输入二叉树的先序序列。

提示:一棵二叉树的先序序列是一个字符串,若字符是‘#’,表示该二叉树是空树,否则该字符是相应结点的数据元素。

输出格式:

输出有两行:

第一行是原二叉树的中序遍历序列;

第二行是交换后的二叉树的中序遍历序列。

输入样例:

ABC##DE#G##F###

输出样例:

CBEGDFA
AFDGEBC

代码长度限制   16 KB

时间限制     400 ms

内存限制     64 MB


思路分析:

1.首先我们要做的就是先创建一个二叉树结点的结构体,它包含了char类型的变量,和两个二叉树结点的指针类型,分别是其左右孩子

2.创建二叉树(递归化)

3.完成交换左右孩子函数

4.完成中序遍历函数

创建二叉树结点:

image.png

创建二叉树函数:

二叉树的创建过程是一个递归的过程,递归一般都是这样的格式:

if(递归借书条件)
else(接下来的操作)

那么在创建二叉树是怎么样的呢?

首先if里面是temp不等于'#',对吧
那么当temp不等于#时,我们直接创建一个新的结构体,然后先序的递归创建树

image.png

交换左右孩子函数:

思考一下,这是要改变二叉树的形状,所以我们需要用二级指针
那么如何实现这个函数呢?

  • 我们直接判断结点是否为空\
  • 如果不为空的话,我们创建一个temp中间变量\
  • temp的左边等于结点的右边,temp的右边等于结点的左边,然后让结点等于赋值为temp
  • 最后我们接着递归下去

image.png

中序遍历:

image.png

代码如下:

#include<iostream>
using namespace std;

//二叉树结构体
struct BTNode
{
	char c;
	BTNode* lchild;
	BTNode* rchild;
    //结构体的构造函数
	BTNode() {
		c = '\0';
		lchild = NULL;
		rchild = NULL;
	}
	BTNode(char x) {
		c = x;
		lchild = NULL;
		rchild = NULL;
	}
};

BTNode* T;

//创建二叉树
void CreatBTtree(BTNode*& root) {
	char temp;
	cin >> temp;
	if (temp != '#') {
		root = new BTNode(temp);
		CreatBTtree(root->lchild);
		CreatBTtree(root->rchild);
	}
}

//交换左右孩子
void Swapchild(BTNode*& root) {
	if (root == NULL)
		return;
	else {
		BTNode* temp = new BTNode;
		temp->c = root->c;
		temp->lchild = root->rchild;
		temp->rchild = root->lchild;
		root = temp;
		Swapchild(root->lchild);
		Swapchild(root->rchild);
	}
}

//中序遍历
void InOrder(BTNode* root) {
	if (root == NULL)
		return;
	InOrder(root->lchild);
	cout << root->c;
	InOrder(root->rchild);
}

int main()
{
	CreatBTtree(T);
	InOrder(T);
	cout << endl;
	Swapchild(T);
	InOrder(T);
	return 0;
}

PS:成功解题=理清思路+一定的技巧~