翻转2元搜索树(镜像)这两种思路

问题叙述性说明:

输入搜索树2元,树被转换为它的镜面。

即在转换后的二元查找树中,左子树的结点都大于右子树的结点。


算法:

測试用例:

                                  10

                             /            

                           5               11

                       /        

                    3            7

                 /             /  

               2       4     6      9

             /                       /

          1                       8

算法:

有两种思路:

①递归。对树翻转。仅仅需对他的左右子树翻转,再交换左右子树的位置就可以。

②非递归。设置一个队列queue,从根节点開始处理:人节点先入列,当队列非空时,循环进行下面处理:从队列中取出一节点。交换他的左右子树的位置,将它的左右子节点入列(若存在的话)。当队列为空时,返回。

代码实现:

①递归

<p align="left"><pre name="code" class="cpp">template<class T>
void ReverseTree(BinaryTreeNode<T>* t)
{
	if (!t)
		return;
	BinaryTreeNode<T>* temp = new BinaryTreeNode<T>;
	temp = t->LeftChild;
	t->LeftChild = t->RightChild;
	t->RightChild = temp;
	ReverseTree(t->LeftChild);
	ReverseTree(t->RightChild);
	return;
}



非递归:

//非递归
template<class T>
void ReverseTree2(BinaryTreeNode<T>* t)
{
	if (!t)
		return;
	Queue<BinaryTreeNode<T>*> q;
	q.Add(t);
	BinaryTreeNode<T>* tt = new BinaryTreeNode < T >;
	while (!q.IsEmpty())
	{
		q.Delete(tt);
		BinaryTreeNode<T>* temp = new BinaryTreeNode < T >;
		temp = tt->LeftChild;
		tt->LeftChild = tt->RightChild;
		tt->RightChild = temp;
		if (tt->LeftChild)
			q.Add(tt->LeftChild);
		if (tt->RightChild)
			q.Add(tt->RightChild);
	}
}


输出測试:

InOrder(n10);
	cout << endl;
	ReverseTree(n10);
	InOrder(n10);
	cout << endl;

	ReverseTree2(n10);
	InOrder(n10);
	cout << endl;




版权声明:本文博主原创文章。博客,未经同意,不得转载。

原文地址:https://www.cnblogs.com/mengfanrong/p/4759776.html