携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第25天,点击查看活动详情
题目描述:
以二叉链表作为二叉树的存储结构,交换二叉树中每个结点的左孩子和右孩子。
输入格式:
输入二叉树的先序序列。
提示:一棵二叉树的先序序列是一个字符串,若字符是‘#’,表示该二叉树是空树,否则该字符是相应结点的数据元素。
输出格式:
输出有两行:
第一行是原二叉树的中序遍历序列;
第二行是交换后的二叉树的中序遍历序列。
输入样例:
ABC##DE#G##F###
输出样例:
CBEGDFA
AFDGEBC
代码长度限制 16 KB
时间限制 400 ms
内存限制 64 MB
思路分析:
1.首先我们要做的就是先创建一个二叉树结点的结构体,它包含了char类型的变量,和两个二叉树结点的指针类型,分别是其左右孩子
2.创建二叉树(递归化)
3.完成交换左右孩子函数
4.完成中序遍历函数
创建二叉树结点:
创建二叉树函数:
二叉树的创建过程是一个递归的过程,递归一般都是这样的格式:
if(递归借书条件)
else(接下来的操作)
那么在创建二叉树是怎么样的呢?
首先if里面是temp不等于'#',对吧
那么当temp不等于#时,我们直接创建一个新的结构体,然后先序的递归创建树
交换左右孩子函数:
思考一下,这是要改变二叉树的形状,所以我们需要用二级指针
那么如何实现这个函数呢?
- 我们直接判断结点是否为空\
- 如果不为空的话,我们创建一个temp中间变量\
- temp的左边等于结点的右边,temp的右边等于结点的左边,然后让结点等于赋值为temp
- 最后我们接着递归下去
中序遍历:
代码如下:
#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:成功解题=理清思路+一定的技巧~