您的位置:首页 > Web前端

剑指Offer 1521 二叉树的镜像

2013-09-16 00:09 453 查看
第15题:

题目:输入一颗二元查找树,将该树转换为它的镜像,

即在转换后的二元查找树中,左子树的结点都大于右子树的结点。

用递归和循环两种方法完成树的镜像转换。

#include <cstdlib>
#include <iostream>
#include <stdio.h>
using namespace std;
struct TreeNode
{
TreeNode *left;
TreeNode *right;
int value;
};
bool firstprint;

void change(TreeNode *current)
{

if(current->left == NULL && current->right == NULL)
return;
if(current->left != NULL)
change(current->left);
if(current->right != NULL)
change(current->right);
if(current->left != NULL || current->right != NULL)
{
TreeNode *temp = current->left;
current->left = current->right;
current->right = temp;
}
}
/*
void change(TreeNode *root){
if(root==NULL)
{
return;
}
TreeNode *temp = root->left;
root->left = root->right;
root->right = temp;
if(root->left)
change(root->left);
if(root->right)
change(root->right);
}
*/
void preTravel(TreeNode *current)
{
if(current){
if(firstprint == true) {
printf("%d",current->value);
firstprint = false ;
}
else printf(" %d",current->value);
preTravel(current->left);
preTravel(current->right);
}
}

int main(int argc, char *argv[])
{
TreeNode node[1500];
int n;
int one, two;
char ci;
while(scanf("%d", &n) != EOF)
{
firstprint = true;
for(int i = 0; i < n; i++)
cin >> node[i].value;
for(int i = 0; i < n; i++)
{
cin >> ci;
if(ci == 'd')
{
cin >> one >> two;
node[i].left = &node[one-1];
node[i].right = &node[two-1];
}
else if(ci == 'l')
{
cin >> one;
node[i].left = &node[one-1];
node[i].right = NULL;
}
else if(ci == 'r')
{
cin >> two;
node[i].left = NULL;
node[i].right = &node[two-1];
}
else
{
node[i].left = NULL;
node[i].right = NULL;
}
}
if(n == 0)
printf("NULL\n");
else
{
change(&node[0]);
preTravel(&node[0]);
printf("\n");
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: