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