题目:
以二叉链表作为二叉树的存储结构,交换二叉树中每个结点的左孩子和右孩子。
思路:
首先根据给出的字符串先把二叉树建起来,这里稍稍卡了一下(所以决定写个博客存一下);
建起来后就好说了,递归交换左右子树;
然后递归中序遍历就ok了!
代码:
#include <bits/stdc++.h> #include <cstdio> #include <cstring> #include <iostream> #include <vector> #include <algorithm> #include <queue> #include <iomanip> #define MAX 1000000000 #define inf 0x3f3f3f3f #define FRE() freopen("in.txt","r",stdin) using namespace std; typedef long long ll; const int maxn = 10005; struct Node { char date; Node* rt; Node* lt; }; typedef Node* Tree; int len,idx; string str; void build(Tree& root) { if(str[idx]=='#'||idx==len) return; root = new Node; root->date = str[idx]; root->lt = NULL; root->rt = NULL; idx++;//因为在字符串中是一直向后走的,所以这里用一个全局变量表示字符串你的下标就ok了 build(root->lt); idx++; build(root->rt); return; } void exchangeNode(Tree& root)//从根节点一次交换左右子树就搞定! { if(root->lt==NULL && root->rt==NULL) return; Node* temp; temp = root->lt; root->lt = root->rt; root->rt = temp; if(root->lt!=NULL) exchangeNode(root->lt); if(root->rt!=NULL) exchangeNode(root->rt); } void midTravel(Tree root)//中序遍历二叉树 { if(root->lt!=NULL) midTravel(root->lt); printf("%c",root->date); if(root->rt!=NULL) midTravel(root->rt); } int main() { // FRE(); cin>>str; len = str.length(); idx = 0; Tree root = NULL; build(root); midTravel(root); printf(" "); exchangeNode(root); midTravel(root); return 0; }