求树的镜像的过程其实是在遍历树的同时交换非叶节点的左右子节点。
二叉树的节点定义如下:
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);
}
}