剑指offer 27. 二叉树的镜像

声明:本系列博客是对何海涛《剑指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);

	}	
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值