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

来源:互联网 发布:修改linux账号权限 编辑:程序博客网 时间:2024/06/05 00:50

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

例如输入: 

        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;}



原创粉丝点击