求一颗二叉树的镜像

二叉树的镜像,通俗来讲就是镜子中所呈的像,左右颠倒。如图就是一个简单的二叉树镜像图。

这里写图片描述

二叉树镜像的过程

这里写图片描述

从图中可以看出,这棵树的根节点相同,但它们的左右两个子节点交换了位置。因此,我们不妨先交换根节点的两个子节点,就得到图中的第二颗树。

交换根节点的两个子节点后,我们发现值为3,2的节点的子节点仍然保持不变,因此我们还需要交换这两个节点的左右子节点。交换完之后就分别得到图中的第三、四颗树。做完这两次交换之后,就已经遍历完这颗树了,此时交换完之后的二叉树就是原树的镜像。

#include <iostream>

using namespace std;

template<class T>
struct BinaryTreeNode
{
    BinaryTreeNode(const T data)
        :_data(data)
        ,_Left(NULL)
        ,_Right(NULL)
    {}

    T _data;
    BinaryTreeNode<T>* _Left;
    BinaryTreeNode<T>* _Right;
};

template<class T>
class BinaryTree
{
    typedef BinaryTreeNode<T> Node;
public:
    BinaryTree()
        :_root(NULL)
    {}

    BinaryTree(const T array[], size_t size, const T& invalid)
    {
        size_t index = 0;
        _CreateBinaryTree(_root, array, size, invalid, index);
    }

    void MirrorTree()
    {
        _MirrorTree(_root);
    }
private:

    //创建二叉树
    void _CreateBinaryTree(Node*& root, const T array[], size_t size, const T& invalid, size_t& index)
    {
        while ((index < size) && (array[index] != invalid))
        {
            //创建根节点
            root = new Node(array[index]);
            //创建根节点的左子树
            _CreateBinaryTree(root->_Left, array, size, invalid, ++index);
            //创建根节点的右子树
            _CreateBinaryTree(root->_Right, array, size, invalid, ++index);
        }
    }

    //二叉树的镜像
    void _MirrorTree(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 != NULL)
            _MirrorTree(root->_Left);

        if (root->_Right != NULL)
            _MirrorTree(root->_Right);
    }

private:
    BinaryTreeNode<T>* _root;
};


int main()
{
    const char* ptr = "124###35##6";
    BinaryTree<char> t(ptr, strlen(ptr), '#');

    t.MirrorTree();

    return 0;

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值