题目要求
以二叉链表作为二叉树的存储结构,交换二叉树中每个结点的左孩子和右孩子。
输入格式:
输入二叉树的先序序列。
提示:一棵二叉树的先序序列是一个字符串,若字符是‘#’,表示该二叉树是空树,否则该字符是相应结点的数据元素。
输出格式:
输出有两行:
第一行是原二叉树的中序遍历序列;
第二行是交换后的二叉树的中序遍历序列。
输入样例:
ABC##DE#G##F###
输出样例:
CBEGDFA
AFDGEBC
思路分析
因为涉及到左右孩子结点的交换,采用链表结构建树
- 根据先序遍历输入树
- 接着将建好的树中序遍历输出
- 先序遍历将左右子树交换
- 最后将交换后的树中序遍历输出
(本来是想直接输出时候先输出右子树,再输出左子树,这样是有逻辑错误的,还是应该依次交换后再遍历)
完整代码
#include<iostream>
#include<stack>
using namespace std;
typedef struct node {
char c='#';
node* left ;
node *right ;
}node,*TNode;
char ch;
TNode root;
node *tmp;
void insert(TNode &root) {
if (cin >> ch) {
if (ch == '#') {
root = NULL;
}
else {
root = new node;
root->c = ch;
insert(root->left);
insert(root->right);
}
}
}
void midorder(TNode& root) {
if (root != NULL) {
midorder(root->left);
if (root->c != '#')
cout << root->c;
midorder(root->right);
}
}
void change(TNode&root) {//第一次本来想直接输出的时候反着输就行,后面发现这样有问题
if (root != NULL) {
tmp = root->left;
root->left = root->right;
root->right = tmp;
change(root->left);
change(root->right);
}
}
int main() {
insert(root);
midorder(root);
cout << endl;
change(root);
midorder(root);
return 0;
}