二叉树的镜像树

所谓二叉树的镜像树就是把一个节点下的左右孩子交换,例如:


下面这棵树是一颗深度为3的完全二叉树

          

那么它的镜像就应该是


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

由于输入的数据的格式是

(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;
}


  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值