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

题目:输入一颗二元查找树,将该树转换为它的镜像,
即在转换后的二元查找树中,左子树的结点都大于右子树的结点。
用递归和循环两种方法完成树的镜像转换。 
例如输入:
  8
  / /
  6 10
 // //
5 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>
using namespace std;

struct BSTreeNode
{
	int m_nValue;			// value of node
	BSTreeNode *m_pLeft;	// left child of node
	BSTreeNode *m_pRight;	// right child of node

	BSTreeNode();
	BSTreeNode(int value);
};

void insert(BSTreeNode** root,int n);	//树的插入操作
void inversive(BSTreeNode* root);		//树的反转

int main()
{
	BSTreeNode* root = NULL;
	insert(&root,8);
	insert(&root,6);
	insert(&root,10);
	insert(&root,5);
	insert(&root,7);
	insert(&root,9);
	insert(&root,11);
	inversive(root);

	return 0;
}

void insert(BSTreeNode** root,int n)
{
	BSTreeNode* temp = new BSTreeNode;
	BSTreeNode* current ;
	temp->m_nValue = n ;
	temp->m_pLeft = NULL ;
	temp->m_pRight = NULL ;
	if (*root == NULL)
	{
		*root = new BSTreeNode(n);
	}
	else
	{
		current = *root ;
		while(current != NULL)
		{
			if (current->m_nValue>n&¤t->m_pLeft==NULL)
			{
				current->m_pLeft = temp ;
				break;
			}
			else if (current->m_nValue>n&¤t->m_pLeft!=NULL)
			{
				current = current->m_pLeft;
				continue;
			}
			else if (current->m_nValue<n&¤t->m_pRight==NULL)
			{
				current->m_pRight = temp;
				break;
			}
			else if (current->m_nValue<n&¤t->m_pRight!=NULL)
			{
				current = current->m_pRight;
				continue;
			}
		}
	}
}

BSTreeNode::BSTreeNode(int value)
{
	m_nValue = value ;
	m_pLeft = NULL ;
	m_pRight = NULL ;
}

BSTreeNode::BSTreeNode()
{}

void inversive(BSTreeNode* root)
{
	if (root != NULL)
	{
		BSTreeNode* temp = root->m_pLeft ;
		root->m_pLeft = root->m_pRight ;
		root->m_pRight = temp ;
		inversive(root->m_pLeft);
		inversive(root->m_pRight);
	}
}


循环:这里要用到队里,先将节点的左右孩子入队列,然后交换左右孩子,知道队列为空!

#include <iostream>
#include <queue>
using namespace std;

struct BSTreeNode
{
	int m_nValue;			// value of node
	BSTreeNode *m_pLeft;	// left child of node
	BSTreeNode *m_pRight;	// right child of node

	BSTreeNode();
	BSTreeNode(int value);
};

void insert(BSTreeNode** root,int n);	//树的插入操作
void inversive(BSTreeNode* root);		//树的反转

int main()
{
	BSTreeNode* root = NULL;
	insert(&root,8);
	insert(&root,6);
	insert(&root,10);
	insert(&root,5);
	insert(&root,7);
	insert(&root,9);
	insert(&root,11);
	inversive(root);

	return 0;
}

void insert(BSTreeNode** root,int n)
{
	BSTreeNode* temp = new BSTreeNode;
	BSTreeNode* current ;
	temp->m_nValue = n ;
	temp->m_pLeft = NULL ;
	temp->m_pRight = NULL ;
	if (*root == NULL)
	{
		*root = new BSTreeNode(n);
	}
	else
	{
		current = *root ;
		while(current != NULL)
		{
			if (current->m_nValue>n&¤t->m_pLeft==NULL)
			{
				current->m_pLeft = temp ;
				break;
			}
			else if (current->m_nValue>n&¤t->m_pLeft!=NULL)
			{
				current = current->m_pLeft;
				continue;
			}
			else if (current->m_nValue<n&¤t->m_pRight==NULL)
			{
				current->m_pRight = temp;
				break;
			}
			else if (current->m_nValue<n&¤t->m_pRight!=NULL)
			{
				current = current->m_pRight;
				continue;
			}
		}
	}
}

BSTreeNode::BSTreeNode(int value)
{
	m_nValue = value ;
	m_pLeft = NULL ;
	m_pRight = NULL ;
}

BSTreeNode::BSTreeNode()
{}

void inversive(BSTreeNode* root)
{
	queue<BSTreeNode*> q ;
	BSTreeNode* temp = root;
	BSTreeNode* nowswap = NULL;
	q.push(temp);
	while (!q.empty())
	{
		temp = q.front();
		q.pop();
		if (temp->m_pLeft != NULL)
			q.push(temp->m_pLeft);
		if (temp->m_pRight != NULL)
			q.push(temp->m_pRight);
		nowswap = temp->m_pLeft ;
		temp->m_pLeft = temp->m_pRight ;
		temp->m_pRight = nowswap ;
	}
}


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值