【C++】二叉树的应用1

来源:互联网 发布:pc安装mac os x教程 编辑:程序博客网 时间:2024/05/07 10:23

1.二叉树结点的声明,二叉树的声明

2.二叉树结点的插入和删除

3.二叉树结点计数,叶子结点计数

4.二叉树的深度

5.二叉树的前中后序遍历递归版本

6.二叉树的层次遍历

7.两棵二叉树的形态是否相同

#include<iostream>#include<queue>using namespace std;template <class entry>class binarynode{public:entry data;binarynode<entry> *left;binarynode<entry> *right;binarynode(entry a){this->data = a;this->left = NULL;this->right = NULL;}};template <class entry>class binarytree{public:int size;int count;binarynode<entry> *root;binarynode<entry> *current;binarytree(){this->size = 0;this->count = 0;this->root = NULL;this->current = NULL;}void insert(entry a){binarynode<entry> *b = new binarynode<entry>(a);if(root==NULL)root = b;else{binarynode<entry> *parent = root;current = root;while(current!=NULL){    if(a<current->data){parent = current;    current = parent->left;    }    if(current!=NULL&&a>current->data){parent = current;    current = parent->right;    }}if(a<parent->data)parent->left = b;elseparent->right = b;}size++;}void deletenode(entry a){binarynode<entry> *p = root;binarynode<entry> *parent = root;current = root;while(current->data!=a&¤t!=NULL){if(current->data<a){parent = current;current = parent->right;}else{parent = current;current = parent->left;}}if(current==NULL)exit(0);else{if(current->left==NULL&¤t->right==NULL){if(parent==NULL)root = NULL;if(current->data<parent->data){parent->left = NULL;}else{parent->right = NULL;}}else if(current->left==NULL){if(parent==NULL)root = current->right;else{if(current->data<parent->data){    parent->left = current->right;    }    else{    parent->right = current->right;    }}}else{binarynode<entry> *pparent = current->left;p = current->left;while(p->right!=NULL){pparent = p;p = pparent->right;}current->data = p->data;if(pparent->left == p)pparent->left = p->left;elsepparent->right = p->left;}}size--;}void level(){queue<binarynode<entry>*> current;binarynode<entry> *p = root;current.push(p);while(!current.empty()){queue<binarynode<entry>*> next;do{p = current.front();cout<<p->data;current.pop();if(p->left!=NULL) next.push(p->left);    if(p->right!=NULL) next.push(p->right);}while(!current.empty());current = next;}}void preorder(binarynode<entry> *r){if(r==NULL)return;cout <<r->data;preorder(r->left);preorder(r->right);}void inorder(binarynode<entry> *r){if(r==NULL)return;inorder(r->left);cout <<r->data;inorder(r->right);}void postorder(binarynode<entry> *r){if(r==NULL)return;postorder(r->left);postorder(r->right);cout <<r->data;}int leafcount(binarynode<entry> *t){if(t==NULL) return 0;else if(t->left==NULL&&t->right==NULL)return 1;elsereturn leafcount(t->left)+leafcount(t->right);}int nodecount(binarynode<entry> *y){if(y==NULL) return 0;else count++;nodecount(y->left);nodecount(y->right);return count;}int deepth(binarynode<entry> *i){if(i==NULL) return 0;else return max(deepth(i->left),deepth(i->right))+1;}bool same(binarynode<entry> *f,binarynode<entry> *o){if(f==NULL&&o==NULL)return true;else if(f!=NULL&&o!=NULL)return same(f->left,o->left)&&same(f->right,o->right);elsereturn false;}};int main(){char a[] = {'b','a','q','z','f','p','e','u'};char c[] = {'f','p','a','q','b','z','j','u'};int k = sizeof(a)/sizeof(a[0]);    binarytree<char> d;binarytree<char> b;for(int i = 0;i<k;i++){d.insert(a[i]);b.insert(c[i]);}b.preorder(b.root);cout<<endl;b.inorder(b.root);cout<<endl;b.postorder(b.root);cout<<endl;b.level();cout<<endl;cout<<b.leafcount(b.root)<<endl;cout<<b.nodecount(b.root)<<endl;cout<<b.size<<endl;cout<<b.deepth(b.root)<<endl;cout<<b.same(b.root,d.root)<<endl;}


0 0
原创粉丝点击