学习笔记之树的镜像

前段时间去一家公司参加面试,碰到了一个问题,讲的是树的镜像问题,当时莫名其妙,后面想想应该是跟平面镜成像原理似的,回来研究后得出如下结论。

问题描述:输入一颗二元查找树,将该树转换为它的镜像,即在转换后的二元查找树中,左子树的结点都大于右子树的结点。用递归和循环两种方法完成树的镜像转换。


例如输入:

  8

  / /

  6 10

 // //

5 7 9 11

输出:

   8

  / /

 10 6

 // //

11 9 7 5

      定义二元查找树的结点为:

  1. struct BSTreeNode    
  2. {    
  3.     int value;    
  4.     BSTreeNode *left;    
  5.     BSTreeNode *right;    
  6. };    

      思路:题目要求用两种方法,递归和循环,其实质是一样的。

      解法一:用递归。假设当前结点为pNode,只需交换该结点的左右子女,然后分别递归求解左子树和右子树即可。代码极为简单。

      解法二:用循环,需要一个辅助栈完成,每次取栈顶元素交换左右子女,然后将左右子女分别压入辅助栈,当栈中元素为空时,结束循环。其实不论是递归也好,循环也好,都是利用栈的特性完成。

      参考代码:

  1. //函数功能 : 输入一颗二元查找树,将该树转换为它的镜像  
  2. //函数参数 : pRoot为根结点  
  3. //返回值 :   根结点  
  4. BSTreeNode * Mirror_Solution1(BSTreeNode * pRoot)  
  5. {  
  6.     if(pRoot != NULL)  
  7.     {  
  8.         BSTreeNode * pRight = pRoot->right;  
  9.         BSTreeNode * pLeft = pRoot->left;  
  10.         pRoot->left = Mirror_Solution1(pRight);  //转化右子树  
  11.         pRoot->right = Mirror_Solution1(pLeft);  //转化左子树  
  12.     }  
  13.     return pRoot;  
  14. }  

  1. BSTreeNode * Mirror_Solution2(BSTreeNode * pRoot)  
  2. {  
  3.     if(pRoot != NULL)  
  4.     {  
  5.         stack<BSTreeNode *> stk;   //辅助栈  
  6.         stk.push(pRoot);           //压入根结点  
  7.         while(stk.size())  
  8.         {  
  9.             BSTreeNode *pNode = stk.top();  
  10.             BSTreeNode *pLeft = pNode->left;  
  11.             BSTreeNode* pRight = pNode->right;  
  12.             stk.pop();  
  13.   
  14.             if(pLeft != NULL)  
  15.                 stk.push(pLeft);  
  16.             if(pRight != NULL)  
  17.                 stk.push(pRight);  
  18.             pNode->left = pRight;  //交换左右子女  
  19.             pNode->right = pLeft;  
  20.         }  
  21.     }  
  22.     return pRoot;  
  23. }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值