《剑指Offer》学习笔记--面试题19:二叉树的镜像

来源:互联网 发布:淘宝上传宝贝速度 编辑:程序博客网 时间:2024/05/21 20:39

题目:请完成一个函数,输入一个二叉树,该函数输出它的镜像。

二叉树结点的定义如下:

struct BinaryTreeNode{int         m_nValue;BianryTreeNode* m_pLeft;BianryTreeNode* m_pRight;};
树的镜像对很多人来说是一个新的概念,我们未必能够一下子想出求解树的镜像的方法。为了能够形成直观的印象,我们可以自己画一颗二叉树,然后根据照镜子的经验画出它的镜像。

求解一个树的镜像的过程是:我们先前序遍历这棵树的每个结点,如果遍历到的结点有子结点,就交换它的两个子结点。当交换完所有非叶子结点的左右子结点之后,就得到了树的镜像。

代码如下:

void MirrorRecursively(BinaryTreeNode* pNode){if(pNode == NULL)return;if(pNode->m_pLeft == NULL && pNode->m_pRight == NULL)return;BinaryTreeNode *pTemp = pNode->m_pLeft;pNode->m_pLeft = pNode->m_pRight;pNode->m_pRight = pTemp;if(pNode->m_pLeft)MirrorRecursively(pNode->m_pLeft);if(pNode->m_pRight)MirrorRecursively(pNode->m_pRight);}
本题扩展:

上面的代码是用递归实现的,如果要求用循环实现,该如何实现?

void MirrorCycle(BinaryTreeNode* pNode){stack<BinaryTreeNode*> stack;//p是遍历指针BinaryTreeNode* p = pNode;//栈不空或者p不空时循环while(p || !stack.empty()){if(p != NULL){//存入栈中stack.push(p);//交换左右子树BinaryTreeNode* pTemp = p->m_pLeft;p->m_pLeft = p->m_pRight;p->m_pRight = pTemp;//遍历左子树p = p->lchild;}else{//退栈p = stack.top();stack.pop();//访问右子树p = p->rchild;}}//while}


0 0
原创粉丝点击