数据结构里,二叉树是个稍微复杂的数据结构,关于树的问题也都相对复杂,利用树解题的方法也较多,想要掌握树,要掌握最基本的树的遍历,温故而知新,求二叉树的镜像,其实就是遍历二叉树的结点,如果该结点有左孩子或者右孩子则交换连个孩子。 树的遍历有递归和循环两种方法,当然遍历有前序,中序,后序 。这里使用前序遍历法,以后再写中序和后序吧。
镜像二叉树的递归实现:
///面试题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;
}
对二叉树的遍历理解清楚了,这道题也就迎刃而解了,对我更多的是又复习一遍二叉树的遍历。温故而知新。