剑指——二叉树的镜像

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/SwordArcher/article/details/79959220

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

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

#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;
}

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页