什么是二叉树的镜像呢?

   我们可以自己画一颗二叉树。然后根据照镜子画出它的镜像。

如:

  wKiom1cd-Sui13McAAAbohCxaF4564.png

我们不能一次得到二叉树的镜像,要想得到一颗二叉树的镜像,有以下几个步骤:

(1)先交换根的左子树和右子树

wKiom1cd-DuAhciQAAAcQg4Fo_A887.png

(2)交换6的左子树和右子树                      (3)交换10的左子树和右子树

wKioL1cd-ZzQCpjTAAAO36eHys8366.pngwKioL1cd-Zywlz7eAAAOhdbB-DA212.png

得出以上规律后,就可以写代码喽:

class BinaryTreeNode
{
public:
	BinaryTreeNode(const T& data)
		:_data(data)
		,_left(NULL)
		,_right(NULL)
	{}
	T _data;//值
	BinaryTreeNode* _left;//左子树
	BinaryTreeNode* _right;//右子树
};

template <class T>
class BinaryTree
{
public:
	BinaryTree()//无参构造函数
		:_root(NULL)
	{}
	BinaryTree(const T* a,size_t size,const T& invalue)//构造函数
	{
		size_t index = 0;
		_root = _CreatTree(a,size,index,invalue); 
	}
public:
	void PrevOrder()//先根遍历
	{
		cout<<"先根遍历:";
		_PrevOrder(_root);
		cout<<endl;
	}
	
	void Mirro()//镜像
	{
		_Mirro(_root);
	}
public:
	BinaryTreeNode<T>* _CreatTree(const T* a,size_t size,size_t &index,const T& invalue)//创建树
	{
		BinaryTreeNode<T>* root = NULL;
		if(index < size && a[index] != invalue)
		{
			root = new BinaryTreeNode<T>(a[index]);
			root->_left = _CreatTree(a,size,++index,invalue);//左子树
			root->_right = _CreatTree(a,size,++index,invalue);//右子树
		}
		return root;
	}

	void _PrevOrder(BinaryTreeNode<T>* root)//先根遍历
	{
		if(root == NULL)
			return;
		else
		{
			cout<<root->_data<<" ";
			_PrevOrder(root->_left);
			_PrevOrder(root->_right);
		}
	}

	void _Mirro(BinaryTreeNode<T>* root)//镜像
	{
		if(root == NULL)
			return;
		if(root->_left== NULL && root->_right == NULL)//左右子树同时为NULL,停止
			return;

		BinaryTreeNode<T>* tmp = root->_left;//交换左右子树
		root->_left = root->_right;
		root->_right = tmp;

		_Mirro(root->_left);
		_Mirro(root->_right);
	}
protected:
	BinaryTreeNode<T>* _root;//根节点
};