版权声明:知识无界限,大家可自由转载。 https://blog.csdn.net/xidianbaby/article/details/85014002
1-题目
:
输入一棵二元查找树,将该树转换为它的镜像,即在转换后的二元查找树中,左子树的结点都大于右子树的结点。
2-思路
:
在遍历二元查找树时每访问到一个结点,交换它的左右子树。
3-代码
:
//定义二元查找树的结点
struct BSTreeNode
{
int value;
BSTreeNode *pLeft;
BSTreeNode *pRight;
};
//递归实现二元查找树的镜像
void MirrorRecursively(BSTreeNode *pNode)
{
if (!pNode)
{
return;
}
//交换该结点的左右子树
BSTreeNode *pTemp = pNode->pLeft;
pNode->pLeft = pNode->pRight;
pNode->pRight = pTemp;
//若该结点的左子树不为空,则递归翻转
if (pNode->pLeft)
{
MirrorRecursively(pNode->pLeft);
}
//若该结点的右子树不为空,则递归翻转
if (pNode->pRight)
{
MirrorRecursively(pNode->pRight);
}
}
//循环实现二元查找树的镜像
void MirrorIteratively(BSTreeNode *pTreeHead)
{
if (!pTreeHead)
{
return;
}
std::stack<BSTreeNode *> stackTreeNode;
stackTreeNode.pop();
//当栈不为空
while (stackTreeNode.size())
{
//取出栈顶的结点
BSTreeNode *pNode = stackTreeNode.top();
stackTreeNode.pop();
//交换该结点的左右子树
BSTreeNode *pTemp = pNode->pLeft;
pNode->pLeft = pNode->pRight;
pNode->pRight = pTemp;
//若该结点的左右子树不为空,则将其压入栈
if (pNode->pLeft)
{
stackTreeNode.push(pNode->pLeft);
}
if (pNode->pRight)
{
stackTreeNode.push(pNode->pRight);
}
}
}