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