二叉树的镜像20

画图让抽象问题形象化:画图是用来帮助自己分析、推理的常用手段,当问题比较抽象时,不如画出一些与题目相关的图形,辅助自己观察和思考。图形能使抽象的问题具体化、形象化。空想未必能找到题目中隐含的规律和特点。

题目描述:请完成一个函数,输入一个二叉树,该函数输出它的镜像。

二叉树结点定义:

struct BinTreeNode{
  int m_value;
  BinTreeNode *left;
  BinTreeNode *right;
  //创建根节点,值为e
  BinTreeNode* createRoot(int e);
  //将e作为当前结点的左孩子值插入
  void insertAsLC(int e);
  //将e作为当前结点的右孩子值插入
  void insertAsRC(int e);
};

示例图片:

测试用例:

int main(){
    //创建一颗二叉树
    BinTreeNode *tree = new BinTreeNode;
    tree->m_value = 8;

    tree->insertAsLC(6); //左孩子为6
    tree->insertAsRC(10);

    tree->left->insertAsLC(5);
    tree->left->insertAsRC(7);

    tree->right->insertAsLC(9);
    tree->right->insertAsRC(11);
    //输出当前二叉树
    levels(tree); //Output: 8 7 10 5 6 9 11

    std::cout << std::endl;
    //递归版二叉树的镜像
    MirrorRecursively(tree);
    //输出镜像
    levels(tree); //Output: 8, 10, 7, 11, 9, 6, 5


    return 0;
}

函数实现:

//递归版
void MirrorRecursively(BinTreeNode *pNode){
    if(pNode == NULL)
        return;
    //如果没有左孩子和右孩子也要return
    if(pNode->left == NULL && pNode->right == NULL)
        return;
    //否则交换左右孩子节点的值
    //使用临时变量
    BinTreeNode *temp = pNode->left;
    pNode->left = pNode->right;
    pNode->right = temp;
    //继续检查是否有非叶节点的左右子节点
    if(pNode->left)
        MirrorRecursively(pNode->left);
    if(pNode->right)
        MirrorRecursively(pNode->right);
}

其他函数实现:

//创建根节点,值为e
BinTreeNode* BinTreeNode::createRoot(int e){
     BinTreeNode *root = new BinTreeNode;
     root->m_value = e;
     return root;
 }

//作为节点的左孩子插入元素e
void BinTreeNode::insertAsLC(int e){
    BinTreeNode *Left = new BinTreeNode;
    Left->m_value = e;
    this->left = Left;
}

//作为节点的右孩子插入元素e
void BinTreeNode::insertAsRC(int e){
    BinTreeNode *Right = new BinTreeNode;
    Right->m_value = e;
    this->right = Right;
}

//层次遍历,借助队列
void levels(BinTreeNode *root){
    if(root == NULL)
        return;
    std::queue<BinTreeNode*> Q;
    Q.push(root);
    while(!Q.empty()){//如果队列不为空
        //赋值x,避免造成死循环
        BinTreeNode *x = Q.front();
        //先访问根节点(队首)的值
        std::cout << x->m_value << " ";
        //访问后删除队首节点
        Q.pop();
        //如果有左孩子
        if(x->left)
            Q.push(x->left);//入队
        //如果有右孩子
        if(x->right)
            Q.push(x->right);//入队
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值