7-4 交换二叉树中每个结点的左孩子和右孩子 (20 分)

题目:

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

思路:

首先根据给出的字符串先把二叉树建起来,这里稍稍卡了一下(所以决定写个博客存一下);

建起来后就好说了,递归交换左右子树;

然后递归中序遍历就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("\n");
    exchangeNode(root);
    midTravel(root);
    return 0;
}

 

posted @ 2019-03-22 17:05  sykline  阅读(8534)  评论(0编辑  收藏  举报