数据结构面试题/求一棵二叉树的镜像

求树的镜像的过程其实是在遍历树的同时交换非叶节点的左右子节点。
这里写图片描述
二叉树的节点定义如下:

struct BinaryTreeNode  //创建树中的每个结点
{
    BinaryTreeNode(const T& data)
        :_data(data)
        ,_pLeft(NULL)
        ,_pRight(NULL)
    {}
    T _data; //结点的值
    BinaryTreeNode<T>* _pLeft; //左孩子
    BinaryTreeNode<T>* _pRight; //右孩子
};

1.非递归实现,即循环实现—利用队列实现

    //求二叉树的镜像:非递归 --层序-队列
    void GetBinaryMirror_Nor()
    {
        if (NULL == _pRoot)
            return;
        queue<Node*> q;
        q.push(_pRoot);   //入队列
        while (!q.empty())
        {
            Node* pCur = q.front();
            //出队列
            q.pop();
            //交换左右子树
            std::swap(pCur->_pLeft, pCur->_pRight);
            //保存节点pCur的左右子树 在队列中
            if (pCur->_pLeft)
                q.push(pCur->_pLeft);
            if (pCur->_pRight)
                q.push(pCur->_pRight);
        }
    }

2.递归版本—-先前序遍历这棵树的每个节点,如果遍历到的节点有子节点,就交换它的两个子节点。当交换完所有非叶子节点的左右子节点之后,就得到了树的镜像。

    //求二叉树的镜像:递归版本
    void GetBinaryMirror()
    {
        return _GetBinaryMirror(_pRoot);
    }
    void _GetBinaryMirror(Node* pRoot)
    {
        if (pRoot)
        {
            std::swap(pRoot->_pLeft, pRoot->_pRight);
            _GetBinaryMirror(pRoot->_pLeft);
            _GetBinaryMirror(pRoot->_pRight);
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值