题目
请完成一个函数,输入一个二叉树,该函数输出它的镜像。
方法分析
树的镜像,对于很多人来说这个东西可能很陌生,不知道这是个什么东西,未必一下子能够想出来。所以这里在设计算法的时候要利用画图的方式举一些简单的例子去了解题目的规则。
算法设计
(1)使用先序的方式遍历这棵二叉树,如果遍历到的结点有子节点,就交换该结点的两个子节点。
(2)直到遍历完二叉树的所有的非叶子结点,就得到了二叉树的镜像。
测试用例
(1)空树(2)只有一个根结点的树(3)单边的二叉树(4)普通的二叉树
代码实现
(1)递归方式:
void Mirror(TreeNode *pRoot)
{
if(NULL == pRoot)
return;
swap(pRoot->left, pRoot->right);
Mirror(pRoot->left);
Mirror(pRoot->right);
}
void swap(TreeNode* ¶m1, TreeNode* ¶m2)
{
TreeNode *ptmp = param1;
param1 = param2;
param2 = ptmp;
}
(2)循环使用栈方式:
void Mirror(TreeNode *pRoot)
{
stack<TreeNode*> s;
if(pRoot == NULL)
return;
TreeNode *ptop = NULL;
TreeNode *ptmp = NULL;
s.push(pRoot);
while(!s.empty())
{
ptop = s.top();
s.pop();
ptmp = ptop->left;
ptop->left = ptop->right;
ptop->right = ptmp;
if(ptop->right)
s.push(ptop->right);
if(ptop->left)
s.push(ptop->left);
}
}
代码Debug
利用首页的建立二叉树,打印二叉树的代码测试这个函数,把上面的测试用例跑一遍。