开通博客后第一批要做的就是把大学扔QQ空间里的代码迁过来
#include
#include
#include
using namespace std;
class Node {
public :
char element;
Node *lChild,*rChild;
Node() {
element=NULL;
lChild=rChild=NULL;
}
Node(char ch) {
element=ch;
lChild=rChild=NULL;
}
};
class Tree {
private :
Node *root;
public :
Node *getRoot();
Tree();
void Create(Node *&root);
int levelOrder(Node *root);
void preOrder(Node *root);
void preOrder1(Node *root);
void inOrder(Node *root);
void inOrder1(Node *root);
void postOrder(Node *root);
void postOrder1(Node *root);
int sum0(Node *root);
int sum1(Node *root);
int sum2(Node *root);
int height(Node *root);
int width(Node *root);
char Max(Node *root);
void Change(Node *&root);
void deLeaf(Node *&root);
int comTree(Node *root);
};
Node *Tree::getRoot() {
return root;
}
Tree::Tree() {
root=NULL;
}
void Tree::Create(Node *&root) {
char ch;
cin>>ch;
if(ch=='#')
root=NULL;
else {
root=new Node(ch);
Create(root->lChild);
Create(root->rChild);
}
}
int Tree::levelOrder(Node *root) {
int max=0;
using std::queue;
queue
nodeQueue;
Node *p=root;
if(p)
nodeQueue.push(p);
while(!nodeQueue.empty()) {
p=nodeQueue.front();
cout<
element<<' '; if(max
element) max=p->element; nodeQueue.pop(); if(p->lChild) nodeQueue.push(p->lChild); if(p->rChild) nodeQueue.push(p->rChild); } return max-48; } void Tree::preOrder(Node *root) { if(root!=NULL) { cout<
element<<' '; preOrder(root->lChild); preOrder(root->rChild); } } void Tree::preOrder1(Node *root) { using std::stack; stack
nodeStack; Node *p1=root; while(!nodeStack.empty() || p1) { if(p1) { cout<
element<<' '; if(p1->rChild!=NULL) nodeStack.push(p1->rChild); p1=p1->lChild; } else { p1=nodeStack.top(); nodeStack.pop(); } } } void Tree::inOrder(Node *root) { if(root!=NULL) { inOrder(root->lChild); cout<
element<<' '; inOrder(root->rChild); } } void Tree::inOrder1(Node *root) { using std::stack; stack
nodeStack2; Node *p2=root; while(!nodeStack2.empty() || p2) { if(p2) { nodeStack2.push(p2); p2=p2->lChild; } else { p2=nodeStack2.top(); cout<
element<<' '; p2=p2->rChild; nodeStack2.pop(); } } } void Tree::postOrder(Node *root) { if(root!=NULL) { postOrder(root->lChild); postOrder(root->rChild); cout<
element<<' '; } } void Tree::postOrder1(Node *root) { using std::stack; stack
nodeStack0; Node *p0=root; Node *pre=root; while(p0) { for(;p0->lChild!=NULL;p0=p0->lChild) nodeStack0.push(p0); while(p0!=NULL && (p0->rChild==NULL || p0->rChild==pre)) { cout<
element<<' '; pre=p0; if(nodeStack0.empty()) return ; p0=nodeStack0.top(); nodeStack0.pop(); } nodeStack0.push(p0); p0=p0->rChild; } } int sum0(Node *root) { int sum=0,n,m; if(root) { if((!root->lChild) && (!root->rChild)) sum++; n=sum0(root->lChild); sum+=n; m=sum0(root->rChild); sum+=m; } return sum; } int sum1(Node *root) { int sum=0,n,m; if(root) { if((root->lChild==NULL && root->rChild!=NULL) || (root->lChild!=NULL && root->rChild==NULL)) sum++; n=sum1(root->lChild); sum+=n; m=sum1(root->rChild); sum+=m; } return sum; } int sum2(Node *root) { int sum=0,n,m; if(root) { if((root->lChild) && (root->rChild)) sum++; n=sum2(root->lChild); sum+=n; m=sum2(root->rChild); sum+=m; } return sum; } int Tree::height(Node *root) { int lh,rh; if(root==NULL) return 0; else { lh=height(root->lChild); rh=height(root->rChild); return lh>rh?(lh+1):(rh+1); } } int Tree::width(Node *root) { int max=0; int *a=new int[height(root)+1]; for(int i=0;i
qq; Node *pp=root; if(pp) qq.push(pp); while(!qq.empty()) { pp=qq.front(); a[height(pp)]++; qq.pop(); if(pp->lChild) qq.push(pp->lChild); if(pp->rChild) qq.push(pp->rChild); } for(int i=1;i
lChild) && (root->rChild)) { p=root->lChild; root->lChild=root->rChild; root->rChild=p; Change(root->lChild); Change(root->rChild); } } int Tree::comTree(Node *root) { int tag[30]; for(int i=0;i<30;i++) tag[i]=-1;//初始化为-1 int counter=0; using std::queue; queue
Queue; Node *pointer=root; if(pointer) { Queue.push(pointer); tag[counter++]=1; } while(!Queue.empty()) { pointer=Queue.front(); Queue.pop(); if(pointer->lChild) { tag[counter++]=1;//非空则赋值1 Queue.push(pointer->lChild); } if(pointer->lChild==NULL) tag[counter++]=0;//空则置为0 if(pointer->rChild) { tag[counter++]=1; Queue.push(pointer->rChild); } if(pointer->rChild==NULL) tag[counter++]=0; } int sign; for(int i=0;i<30;i++) { if(tag[i]==0) { sign=i; cout<<"第"<
<<"个位置第一次出现空结点"<
lChild && !root->rChild) { root=NULL; return; } deLeaf(root->lChild); deLeaf(root->rChild); } } void main() { Tree T; Node *root=T.getRoot(); cout<<"创建二叉树"<