剑指——二叉树的镜像

请完成一个函数,输入一个二叉树,该函数输出它的镜像

思路:先前序遍历这棵树的每个节点,如果遍历到的节点有子节点,就交换它的俩个子节点。当交换完所有非叶子节点的左右子节点之后,就得到了树的镜像

#include <stdio.h>
#include <iostream>
#include <string>
using namespace std;

struct BinaryTree
{
  int m_value;
  struct BinaryTree* leftChild;
  struct BinaryTree* rightChild;
};

//index 设置为&类型 则此函数调用后index会发生改变
BinaryTree* createTree(BinaryTree* root,int* s,int& index)
{
    if(s[index]==0)  //如果第一个是0则代表为空
        return NULL;
    root=new BinaryTree;
    root->m_value=s[index];
    root->leftChild=createTree(root->leftChild,s,++index);
    root->rightChild=createTree(root->rightChild,s,++index);
    return root;
}

//前序遍历
void preTraverse(BinaryTree* root)
{
    if(root==NULL)
        return;
    cout<<root->m_value<<endl;
    preTraverse(root->leftChild);
    preTraverse(root->rightChild);
}

//镜像化
void MirrorRecursively(BinaryTree* root)
{
    if(root==NULL)
        return ;
    if(root->leftChild==NULL && root->rightChild==NULL)  //root的左右子节点都是NULL的话不交换
        return ;
    if(root->leftChild==NULL)  
    {
       root->leftChild=root->rightChild;
       root->rightChild=NULL;
    }
    else if(root->rightChild==NULL)
    {
        root->rightChild=root->leftChild;
        root->leftChild=NULL;
    }
    else
    {
        BinaryTree* tmp=root->leftChild;
        root->leftChild=root->rightChild;
        root->rightChild=tmp;
    }
    MirrorRecursively(root->leftChild);
    MirrorRecursively(root->rightChild);
}

int main()
{
    //输入的时候,不能忘记用0来补充NULL值
    int Tree[]={8,6,5,0,0,7,0,0,10,9,0,0,11,0,0};

    int index=0;
    BinaryTree* root=NULL;
    root=createTree(root,Tree,index);

    preTraverse(root);
    cout<<"----"<<endl;

    MirrorRecursively(root);
    preTraverse(root);

    return 0;
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值