第15 题: 题目:输入一颗二元查找树,将该树转换为它的镜像,

即在转换后的二元查找树中,左子树的结点都大于右子树的结点。用递归和循环两种方法完成树的镜像转换。

例如输入: 

        8
       / \
      6 10
      /\ /\
    7 9 11

输出: 

          8
      /     \
   10     6
     /\      /\
  11 9 7 5

定义二元查找树的结点为:

struct BSTreeNode // a node in the binary search tree (BST)
{
int m_nValue; // value of node
BSTreeNode *m_pLeft; // left child of node
BSTreeNode *m_pRight; // right child of node
};

分析:镜像转换无非就是对每个节点进行一个左右交换。

#include <iostream>
#include <queue>

using namespace std;

struct BNode
{
	int key;
	BNode *m_pl;
	BNode *m_pr;
};

typedef BNode* T;
typedef queue<T> QET;

void CreateTree(BNode* &head)
{
	QET qe;

	head = new BNode();
	cin >> head->key;
	head->m_pl = head->m_pr = 0;
	qe.push(head);

	while ( !qe.empty() )
	{
		BNode *temp = qe.front();
		qe.pop();
		cout << temp->key << "的左右子女的关键字,空用-1表示:" << endl;
		
		BNode *l = new BNode();
		BNode *r = new BNode();

		cin >> l->key >> r->key ;
		if (l->key == -1)
			delete l;
		else 
		{
			l->m_pl = l->m_pr = 0;
			temp->m_pl = l;
			qe.push(l);
		}
			
		if (r->key == -1)
			delete r;
		else
		{
			r->m_pl = r->m_pr = 0;
			temp->m_pr = r;
			qe.push(r);
		}
	}
	return ;
}

void RecurWay(BNode *head)
{
	if ( head == 0 )
		return ;

	RecurWay(head->m_pl);
	RecurWay(head->m_pr);
	
	BNode *s = head->m_pl;
	head->m_pl = head->m_pr;
	head->m_pr = s;

	return ;
}

void CircuWay(BNode *head)
{
	QET qe;
	
	if ( head == 0 )
		return ;

	qe.push(head);
	while ( !qe.empty() )
	{
		BNode *top = qe.front();

		if ( top->m_pl )
			qe.push(top->m_pl);
		if ( top->m_pr )
			qe.push(top->m_pr);

		BNode *s = top->m_pl;
		top->m_pl = top->m_pr;
		top->m_pr = s;

		qe.pop();
	}

	return ;
}

int main()
{
	BNode *head = 0;

	CreateTree(head);	
	
	RecurWay(head);
	CircuWay(head);

	return 0;
}

点赞