声明:本系列博客是对何海涛《剑指offer》的关键点总结。
1.树的镜像
定义:树的根结点相同,但是左右两个子节点交换了位置
2.解题思路
1)前序遍历树的每一个结点;
2)如果遍历到的节点有子节点,则交换其左右两个子节点;
3)分别以左子节点和右子节点作为新的根结点,递归调用该函数;
4)当遍历到的结点为叶子结点时,即其左、右子结点都为空,函数返回;
3.代码实现
3.1 递归实现
//二叉树定义
struct BinaryTreeNode{
int value;
BinaryTreeNode* pLeft;
BinaryTreeNode* pRight;
};
void MirrorTreeRecursively(BinaryTreeNode *pNode){
if (pNode == nullptr)
return;
//函数返回的条件,遇到叶子结点
if (pNode->pLeft == nullptr && pNode->pLeft == nullptr)
return;
//交换左右结点
BinaryTreeNode* pTmp = pNode->pLeft;
pNode->pLeft = pNode->pRight;
pNode->pRight = pTmp;
if (pNode->pLeft != nullptr)
MirrorTreeRecursively(pNode->pLeft);
if (pNode->pRight != nullptr)
MirrorTreeRecursively(pNode->pRight);
}
3.2 非递归实现
//二叉树定义
struct BinaryTreeNode{
int value;
BinaryTreeNode* pLeft;
BinaryTreeNode* pRight;
};
void MirrorTree(BinaryTreeNode *pNode){
if (pNode == nullptr)
return;
stack<BinaryTreeNode*> mStack;
BinaryTreeNode* pTopStack = nullptr;//存放栈顶元素
BinaryTreeNode* pTmp = nullptr;//辅助交换
mStack.push(pNode);
while (!mStack.empty()){
//根结点出栈
pTopStack = mStack.top();
mStack.pop();
if (pTopStack->pLeft == nullptr || pTopStack->pLeft == nullptr){
pTmp = pTopStack->pLeft;
pTopStack->pLeft = pTopStack->pRight;
pTopStack->pRight = pTmp;
}
//根结点的左右孩子入栈
if (pTopStack->pLeft != nullptr)
mStack.push(pTopStack->pLeft);
if (pTopStack->pRight != nullptr)
mStack.push(pTopStack->pRight);
}
}