刷题--二叉树的镜像

11 篇文章 0 订阅

题目:请完成一个函数,输入一个二叉树,该函数输出它的镜像
那么什么是二叉树的镜像呢?我们其实可以从生活中得到启示,每个人早上起来都有找镜子的习惯,这样我们就会很容易想明白二叉树的镜像了,
这里写图片描述
如图两颗互为镜像的二叉树.
观察这颗二叉树我们会发现,这两颗二叉树的根节点相同,但是它们的左右两个子节点交换了位置.
步骤:
1:首先交换节点2和节点6
2:第二步:交换将节点1和节点3作为整体然后和节点5和节点6的整体交换
3:将 节点1和节点3交换,节点5和节点7交换这样所有子节点就完成了交换.
这里写图片描述
其实就是递归走子问题,如果有叶子节点,那么久将这两个叶子节点进行交换.

#include<iostream>
#include<assert.h>
using namespace std;

template<class T>
struct  BSTreeNode
{
    T _data;
    BSTreeNode<T>*left;
    BSTreeNode<T>*right;

    BSTreeNode(const T& data =T())
        :_data(data)
        , left(NULL)
        , right(NULL)
    {}
};
template<class T>
class BSTree
{
    typedef BSTreeNode<T> Node;
public:
    BSTree()
        :_root(NULL)
    {}
    ~BSTree()
    {
        _Destory(_root);
    }

    BSTree(T *a, size_t n, const T&invalid = T())
    {
        size_t index = 0;
        _root = _Creat(a, n, index, invalid);
    }



    //二叉树的镜像
    void MirrorBSTree()
    {
        _MirrorBSTree(_root);
    }
private:
    void _Destory(Node*root)
    {
        if(root ==NULL)
                _Destory(root->left);
                _Destory(root->right);
                delete root;
                 root =NULL;
    }

    Node*_Creat( T*a, size_t n, size_t &index, const T&invalied)
    {
        assert(a&&n>0);
        Node*root = NULL;
        if (n > index&&a[index] != invalied)
        {
            root = new Node(a[index]);
            root->left = _Creat(a, n, ++index, invalied);
            root->right = _Creat(a, n, ++index, invalied);
        }
        return root;
    }

    void _MirrorBSTree(Node*root)
    {
        if (root == NULL)
        {
            return;
        }
        if (root->left == NULL&&root->right == NULL)
        {
            return;
        }
        //将左右两个子节点进行交换
        Node*tmp = root->left;
        root->left = root->right;
        root->right = tmp;
        //递归走子问题
        if (root->left)
        {
            _MirrorBSTree(root->left);
        }
        if (root->right)
        {
            _MirrorBSTree(root->right);
        }
    }
private:

    Node*_root;
};

int main()
{

    int a1[] = { 4, 2, 1, '#', '#', 3, '#', '#', 6, 5 ,'#','#',7};
    size_t sz = sizeof(a1) / sizeof(a1[0]);
    BSTree<int> bt(a1,sz,'#');
    bt.MirrorBSTree();
    system("pause");
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值