剑指offer 19---二叉树的镜像

本文介绍了二叉树的镜像操作,包括递归和非递归两种实现方式,特别是针对搜索二叉树的镜像变换。
摘要由CSDN通过智能技术生成

二叉树的镜像 :

镜像即就是在镜子中所成的像

代码实现:

PS:搜索二叉树和普通二叉树实现方法是相同的,只是两种建树过程有所不同,此处实现的是搜索二叉树。

1.递归实现:

#pragma once
#include <iostream>
#include <Windows.h>
#include <assert.h>

using namespace std;

template <class K>
struct SearchBinaryTreeNode
{
	K _key;
	SearchBinaryTreeNode<K>* _left;
	SearchBinaryTreeNode<K>* _right;

	SearchBinaryTreeNode(const K& key)
		:_key(key)
		, _left(NULL)
		, _right(NULL)
	{}
};

template <class K>
class SearchBinaryTree
{
	typedef SearchBinaryTreeNode<K> Node;
public:
	SearchBinaryTree()
		:_root(NULL)
	{}

	~SearchBinaryTree()
	{}

	bool Insert(const K& key)     //建树,递归实现
	{
		if (_root == NULL)
		{
			_root = new Node(key);
			return true;
		}
		Node* parent = NULL;
		Node* cur = _root;
		while (cur)
		{
			if (cur->_key < key)       //要插入的值大于cur的值
			{
				parent = cur;
				cur = cur->_right;
			}
			else if (cur->_key > key)
			{
				parent = cur;
				cur = cur->_left;
			}
			else
			{
				return false;      //不能有相同的key
			}
		}
		//此时找到要插入的位置
		if (parent->_key > key)
		{
			parent->_left = new Node(key);
			return true;
		}
		else
		{
			parent->_right = new Node(key);
			return true;
		}
	}

	void MirrorImage()       //递归实现镜像
	{
		_MirrorImage(_root);
	}

	void InOrder()       //中序遍历
	{
		_InOrder(_root);
		cout << endl;
	}

protected:
	void _InOrder(Node* root)
	{
		if (root == NULL)
		{
			return;
		}
		_InOrder(root->_left);
		cout << root->_key << " ";
		_InOrder(root->_right);
	}

	void _MirrorImage(Node* cur)       //递归实现镜像
	{
		if (cur == NULL)
		{
			return;
		}
		if (cur->_left == NULL && cur->_right == NULL)
		{
			return;
		}
		//只要当前节点有一个孩子不为空,即可交换
		Node* temp = cur->_left;
		cur->_left = cur->_right;
		cur->_right = temp;
		if (cur->_left)
		{
			_MirrorImage(cur->_left);
		}
		if (cur->_right)
		{
			_MirrorImage(cur->_right);
		}
	}

protected:
	Node* _root;     //根节点
};

#include "MirrorImage.h"

void TestMirrorImage()
{
	SearchBinaryTree<int> qq;
	int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	size_t size = sizeof(arr) / sizeof(arr[0]);
	for (size_t i = 0; i < size; ++i)
	{
		qq.Insert(arr[i]);
	}
	qq.InOrder();
	qq.MirrorImage();
	qq.InOrder();
}

int main()
{
	TestMirrorImage();
	system("pause");
	return 0;
}


2.非递归实现,借助栈

void _MirrorImage(Node* cur)         //非递归实现镜像
	{
		if (cur == NULL)
		{
			return;
		}
		stack<Node*> qq;
		qq.push(cur);
		while (!qq.empty())    //栈不为空时
		{
			Node* cur = qq.top();
			qq.pop();
			if (cur->_left != NULL || cur->_right != NULL)    //当前节点左右孩子只要有一个不为空,即可交换
			{
				Node* temp = cur->_left;
				cur->_left = cur->_right;
				cur->_right = temp;
			}
			if (cur->_left)
			{
				qq.push(cur->_left);
			}
			if (cur->_right)
			{
				qq.push(cur->_right);
			}
		}
	}


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值