
首先分析,互为镜像,也就是说,一个节点的左右子树互相交换位置,因此采用递归的方法较为简单,且方便理解,即镜像步骤:
1).交换根结点的左右子树节点。
2).交换左子树(以图中10为例)的左右节点。
3).交换右子树(以图中6为例)的左右结点。
总结上面过程,一颗树的镜像过程:先前序遍历树的每个节点,如果遍历到节点有子节点,就交换它的两个子节点,当交换完所有非叶子节点的左右子节点之后,就得到了树的镜像。
实现如下:
struct BinaryTreeNode
{
int value;
BinaryTreeNode*_left;
BinaryTreeNode*_right;
};
void Mirror(BinaryTreeNode*Node)
{
if (Node == NULL)
return;
if (Node->_left == NULL&&Node->_right == NULL)
return;
BinaryTreeNode*tmp = Node->_left;
Node->_left = Node->_right;
Node->_right = tmp;
if (Node->_left)
Mirror(Node->_left);
if (Node->_right)
Mirror(Node->_right);
}
//以先序的方式构建二叉树,输入-1表示结点为空
void CreateBinaryTree(BinaryTreeNode *&pRoot)
{
int nNodeValue = 0;
cin >> nNodeValue;
if (-1 == nNodeValue)
{
return;
}
else
{
pRoot = new BinaryTreeNode();
pRoot->m_nValue = nNodeValue;
CreateBinaryTree(pRoot->m_pLeft);
CreateBinaryTree(pRoot->m_pRight);
}
}
void PrintInOrder(BinaryTreeNode *&pRoot)
{
if (pRoot != NULL)
{
PrintInOrder(pRoot->m_pLeft);
cout << pRoot->m_nValue << " ";
PrintInOrder(pRoot->m_pRight);
}
}