输入一颗二元查找树,将该树转换为它的镜像(15)

本文介绍如何通过递归和循环方式将二元查找树转换为其镜像,即左子树结点值大于右子树结点值。提供完整的C++代码实现,并附有示例说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

输出:
   8
  / \
 10 6
 /\ /\
11 9 7 5

定义二元查找树的结点为:
struct BSTreeNode // a node in the binary search tree (BST)
{
  int m_nValue; // value of node
  BSTreeNode *m_pLeft; // left child of node
  BSTreeNode *m_pRight; // right child of node
};

#include<iostream>
#include<iomanip>
#include<stack> 
using namespace std;
//定义二元查找树的结点为:
struct BSTreeNode // a node in the binary search tree (BST)
{
int m_nValue; // value of node
BSTreeNode *m_pLeft; // left child of node
BSTreeNode *m_pRight; // right child of node
};
void cfun(BSTreeNode *pt)
{
    if(!pt){
       return;
    }
    BSTreeNode * ptem=pt->m_pLeft;
    pt->m_pLeft=pt->m_pRight;
    pt->m_pRight=ptem;
    if(pt->m_pLeft){
       cfun(pt->m_pLeft);
    }
    if(pt->m_pRight){
       cfun(pt->m_pRight);
    }
}
//考虑用循环实现这个算法
void MirrorIteratively(BSTreeNode *pTreeHead)  
{  
      if(!pTreeHead)  
            return;  
  
      std::stack<BSTreeNode *> stackTreeNode;  
      stackTreeNode.push(pTreeHead);  
  
      while(stackTreeNode.size())  
      {  
          BSTreeNode *pNode = stackTreeNode.top();  
          stackTreeNode.pop();  
  
          // swap the right and left child sub-tree  
          BSTreeNode *pTemp = pNode->m_pLeft;  
          pNode->m_pLeft = pNode->m_pRight;  
          pNode->m_pRight = pTemp;  
  
          // push left child sub-tree into stack if not null  
          if(pNode->m_pLeft)  
              stackTreeNode.push(pNode->m_pLeft);  
  
          // push right child sub-tree into stack if not null  
          if(pNode->m_pRight)  
              stackTreeNode.push(pNode->m_pRight);  
      }  
}   
//这个题目展示了递归变成循环的方法 
int main()
{

    system("pause");
    return 0;
}



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值