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

来源:互联网 发布:不需要交钱的网络兼职 编辑:程序博客网 时间:2024/05/18 00: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 nodeBSTreeNode *m_pLeft;// left child of nodeBSTreeNode *m_pRight;// right child of nodeBSTreeNode();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 nodeBSTreeNode *m_pLeft;// left child of nodeBSTreeNode *m_pRight;// right child of nodeBSTreeNode();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 ;}}