您的位置:首页 > 职场人生

剑指offer阅读笔记 之面试题19 实现二叉树的镜像 之 又复习一遍二叉树

2016-06-22 20:43 411 查看
数据结构里,二叉树是个稍微复杂的数据结构,关于树的问题也都相对复杂,利用树解题的方法也较多,想要掌握树,要掌握最基本的树的遍历,温故而知新,求二叉树的镜像,其实就是遍历二叉树的结点,如果该结点有左孩子或者右孩子则交换连个孩子。 树的遍历有递归和循环两种方法,当然遍历有前序,中序,后序 。这里使用前序遍历法,以后再写中序和后序吧。

镜像二叉树的递归实现:

///////////////////////////////面试题19 镜像二叉树 递归实现
void MirrorRecursively(BinaryTreeNode* pRoot)
{
if(pRoot == NULL)
{
return;
}
if (pRoot->m_pLeft == NULL && pRoot->m_pRight == NULL)
{
return;
}
BinaryTreeNode* pTemp = pRoot->m_pLeft;
pRoot->m_pLeft = pRoot->m_pRight;
pRoot->m_pRight = pTemp;
if (pRoot->m_pLeft)
{
MirrorRecursively(pRoot->m_pLeft);
}
if (pRoot->m_pRight)
{
MirrorRecursively(pRoot->m_pRight);
}
}循环实现,循环遍历二叉树最关键的一点是使用栈存放结点值。
/////////////////////////////// 循环实现 遍历树需要 用栈
void MirrorIteratively(BinaryTreeNode* pRoot)
{
if (pRoot == NULL)
{
return;
}
std::stack<BinaryTreeNode*> stackTreeNode;
stackTreeNode.push(pRoot);
while(stackTreeNode.size()>0)
{
BinaryTreeNode* pNode = stackTreeNode.top();
stackTreeNode.pop();
BinaryTreeNode* pTemp = pNode->m_pLeft;
pNode->m_pLeft = pNode->m_pRight;
pNode->m_pRight = pTemp;
if (pNode->m_pLeft)
{
stackTreeNode.push(pNode->m_pLeft);
}
if (pNode->m_pRight)
{
stackTreeNode.push(pNode->m_pRight);
}

}
return;
}对二叉树的遍历理解清楚了,这道题也就迎刃而解了,对我更多的是又复习一遍二叉树的遍历。温故而知新。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息