Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1006689
  • 博文数量: 150
  • 博客积分: 3017
  • 博客等级: 少校
  • 技术积分: 3829
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-19 14:40
个人简介

Now in Baidu WISE team

文章分类

全部博文(150)

文章存档

2014年(8)

2013年(31)

2012年(111)

分类: C/C++

2012-10-02 14:04:15

这道题的含义就是复制一颗给定的树,把每个结点的左子树变成右子树。
第15题:
题目:输入一颗二元查找树,将该树转换为它的镜像,
即在转换后的二元查找树中,左子树的结点都大于右子树的结点。
用递归和循环两种方法完成树的镜像转换。   
例如输入:
  8
  / \
  6 10
 /\ /\
5 7 9 11

输出:
  8
  / \
 10 6
 /\ /\
11 9 7 5
其递归算法很简单,在上一篇文章中有写。
非递归算法:
类似与先序遍历树的非递归算法,其核心在于,对于每个节点,先遍历左边。如果没有左子树或遍历完左子树,无需入栈/从栈中移除当前节点
如果一个点具有左子树,那么入栈,记录此节点,因为从它的左树回来的时候,要继续遍历他的右节点。
如果没有左子树,那么显然,直接遍历右边即可,回到这个节点的时候不用任何操作,只需继续回到他的父亲就可以了。所以,当处理右节点时,不需要入栈,并且在读右子树的时候,把这个节点直接出栈。
每次读到一个新节点时(1.读取一个左节点,2读取一个右结点),复制当前节点,并建立其与父节点的正确关系。
代码中用了两个指向节点的指针的数组来当作栈,并用一个指针保存地一个复制后的树的根节点。

点击(此处)折叠或打开

  1. Node* MirrorTreeNR(Node* head){
  2.     
  3.     if(!head) return NULL;

  4.     Node *srcstack[1000], *deststack[1000];
  5.     Node **srclist = srcstack;
  6.     Node **destlist = deststack;

  7.     Node *dhead = NULL;
  8.     Node *sroot, *droot;
  9.     sroot = droot = NULL;
  10.     //copy the head node
  11.     sroot= head;
  12.     char isRight = 0;
  13.     while(sroot!=NULL || (*srclist) !=NULL){
  14.         while(sroot){
  15.             srclist ++;
  16.             *srclist = sroot;
  17.             //copy sroot
  18.             Node *tmp = (Node *)malloc(sizeof(Node));
  19.             tmp->value = sroot->value;
  20.             if(dhead == NULL) dhead = tmp;
  21.             if(droot !=NULL){
  22.                 if(isRight == 1){
  23.                     droot->left = tmp;
  24.                 }
  25.                 else{
  26.                     droot->right = tmp;
  27.                 }
  28.             }
  29.             isRight = 0;
  30.             droot = tmp;
  31.             destlist ++;
  32.             *destlist = droot;

  33.             sroot = sroot->left;
  34.         }
  35.         if(*srclist!=NULL){
  36.             sroot = *srclist;
  37.             droot = *destlist;
  38.             sroot = sroot->right;
  39.             isRight = 1;
  40.             *srclist = NULL;
  41.             srclist --;
  42.             *destlist = NULL;
  43.             destlist --;
  44.         }
  45.     }
  46.     return dhead;
  47. }



阅读(1142) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~