二叉搜索树
来源:互联网 发布:橙子网络 编辑:程序博客网 时间:2024/06/11 21:37
#include <iostream>#include <cstdio>#include <cstring>#include <cstdlib>#define maxn 1000#define T charusing namespace std;typedef struct btnode { T data; struct btnode *lchild; struct btnode *rchild;}btnode;btnode *root = NULL;btnode *temp2 = NULL;int leaf_number = 0;btnode* newnode(T x) { btnode* p = (btnode* )malloc(sizeof(btnode)); p->data = x; p->lchild = NULL; p->rchild = NULL; return p;}bool insert1(T x) { //插入节点 btnode *r = NULL, *q = NULL, *p = root; T k = x; while(p) { q = p; if(k < p->data) { p = p->lchild; } else if(k > p->data) { p = p->rchild; } else { cout << "duplicate!" << endl; return false; } } r = newnode(x); if(root) { if(k < q->data) { q->lchild = r; } else { q->rchild = r; } } else{ root = r; } return true;}void exchange(btnode *bt) { //交换左右子树。 if(bt) { exchange(bt->lchild); exchange(bt->rchild); } if(bt == NULL) { return ; } temp2 = bt->lchild; bt->lchild = bt->rchild; bt->rchild = temp2;}void midorder(btnode *bt) { if(bt) { midorder(bt->lchild); cout << bt->data << ' '; midorder(bt->rchild); } if(bt == NULL) { return ; }}int total(btnode *bt) { //求节点总数。感觉写的太缀余。 int rnum = 0, lnum = 0; int num = 0; if(!bt) { return 0; } if(bt->lchild == NULL && bt->rchild == NULL) { leaf_number++; return 1; } if(bt->lchild == NULL && bt->rchild != NULL) { return rnum = total(bt->rchild) + 1; } if(bt->lchild != NULL && bt->rchild == NULL) { return lnum = total(bt->lchild) + 1; } if(bt->lchild != NULL && bt->rchild != NULL) { lnum = total(bt->lchild); rnum = total(bt->rchild); return num = lnum + rnum + 1; } return 0;//suseless}int height(btnode *t) { //求树的高度。 int lh = 0, rh = 0; if(!t) { return 0; } else{ lh = height(t->lchild); rh = height(t->rchild); if(lh>rh){ return lh+1; } else{ return rh+1; } }}void preorder(btnode *bt) { if(bt == NULL) { return ; } if(bt) { cout << bt->data << ' '; preorder(bt->lchild); preorder(bt->rchild); }}int main(){ char str[maxn]; int len = 0; gets(str); len = strlen(str); for(int i = 0; i < len; i++) { insert1(str[i]); } btnode *temp = root; cout << "preorder: "; preorder(temp); cout << endl; cout << "midorder: "; midorder(temp); cout << endl; exchange(temp); cout << "preorder: "; preorder(temp); cout << endl; cout << "midorder: "; midorder(temp); cout << endl; int Total = total(temp); printf("The amount of the node: "); cout << Total << endl; printf("The height of the tree: "); int heigh = height(temp); cout << heigh << endl; printf("The leaf of the tree: "); cout << leaf_number << endl; return 0;}/******************************************************************最近忙着备考,几乎很少写程序,完美结束考试,全心学习编程。程序仅仅说明道理,如果想完善稍加改动即可!测试数据:5382469170********************************************************************/