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

来源:互联网 发布:最美的诗句 知乎 编辑:程序博客网 时间:2024/05/17 22:39
二叉树

一、题目:

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

例如输入:
          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};

二、代码:
1.递归:
#include<iostream>using namespace std;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};class BSTree{public :BSTree(){this->root = this->Create();}~BSTree(){this->Release(this->root);}BSTreeNode *GetRoot();void InOrder(BSTreeNode *root);//中序遍历void getChange(BSTreeNode *root);private :BSTreeNode *root;BSTreeNode *Create();void Release(BSTreeNode *root);};void BSTree::Release(BSTreeNode *root)  {        if (root != NULL){                      Release(root->m_pLeft);   //释放左子树    Release(root->m_pRight);   //释放右子树            delete root;        }  }  BSTreeNode * BSTree::Create(){BSTreeNode *root;int ch;cout<<"请输入节点数据:"<<endl;cin>>ch;if(ch==0) root = NULL;else{root = new BSTreeNode;root->m_nValue = ch;root->m_pLeft = Create();root->m_pRight = Create();}return root;}BSTreeNode *BSTree::GetRoot(){return this->root;}void BSTree::InOrder(BSTreeNode *root){if (root==NULL)  return;      //递归调用的结束条件          else{InOrder(root->m_pLeft);    //中序递归遍历root的左子树cout<<root->m_nValue<<" ";    //访问根结点的数据域InOrder(root->m_pRight);    //中序递归遍历root的右子树}}void BSTree::getChange(BSTreeNode *root){if(root == NULL) return;else {getChange(root->m_pLeft);getChange(root->m_pRight);BSTreeNode *temp = root->m_pLeft;root->m_pLeft = root->m_pRight;root->m_pRight = temp;}}void main(){BSTree bst;BSTreeNode *root = bst.GetRoot();bst.InOrder(root);cout<<endl;bst.getChange(root);cout<<endl;bst.InOrder(root); cout<<endl;}