所谓二叉树的镜像树就是把一个节点下的左右孩子交换,例如: 下面这棵树是一颗深度为3的完全二叉树 20150420234809158.png

它的镜像就应该是 20150420235140529.png

这个问题其实不难,主要是要将树建立起来,然后把左右节点交换就可以啦

由于输入的数据的格式是

(A(B(D)(E))(C(F)))这种形式,(就是上面的第一颗二叉树的结构)我们需要解析字符串然后建立一棵树(这算一个比较麻烦的事吧,对于我刚刚接触这块)

我的想法就是利用栈来做这个问题。 第一步:初始化一个树结构的指针栈,读取第一个括号,然后初始化一个根节点,并压入栈 第二步:开始读取字符串(字符串是绝对正确的),当遇到‘(’的时候就初始化一个子节点,压入栈, 第三步:判断应该把这个节点添加到那个位置,其实就是取得栈里面的栈顶元素,判断它的左右孩子空不空,优先左,其次右。 第四步:遇到‘)’直接把当前的节点指针从栈里面弹掉。 循环的条件就是在字符串不到‘\0’

具体的贴代码:

#include <stdio.h>
#include <stack>
#include <stdlib.h>
#include <iostream>
using namespace std;

//二叉树的节点结构 typedef struct Node{ int data; struct Node *Lchild; struct Node *Rchild; }Node,*Tree;

//把数据转化为树 Tree initTree(char *str){ stack<Tree> s; stack<char> c; Tree T,t,temp; //创建根节点 c.push(*str); str++; T=(Node *)malloc(sizeof(Node)); T->data=*str; T->Lchild=NULL; T->Rchild=NULL; s.push(T); str++; //创建各节点间的关系 while(*str){ if(*str=='('){ c.push('c'); temp=(Node )malloc(sizeof(Node)); temp->data=(++str); temp->Lchild=NULL; temp->Rchild=NULL; t=s.top();//取得父节点 if(t->Lchild==NULL) t->Lchild=temp; else t->Rchild=temp; s.push(temp); } else if(*str==')'){ s.pop(); c.pop(); } str++; } return T; }

//先序遍历,属于二叉树的基本操作 void Preorder(Tree T){ if(T){ printf("%c ",T->data); Preorder(T->Lchild); Preorder(T->Rchild); } }

/*这个就是二叉树的镜像转换函数,其实很简单

和交换变量的值一样的做法

*/ void convert(Tree T){ if(NULL==T) return; Tree temp=T->Lchild;//临时节点 T->Lchild=T->Rchild; T->Rchild=temp;

//递归操作 convert(T->Lchild); convert(T->Rchild); }

int main(){ freopen("test.in","r",stdin); char str[200]; char *s=str; Tree T; while(scanf("%s",str)!=EOF){ T=initTree(s); convert(T); Preorder(T); cout<<endl; } return 0; }