大二C++写的二叉树各种基本操作

开通博客后第一批要做的就是把大学扔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<<"创建二叉树"< 
                        
                       
                      
                     
                    
                   
                  
                 
                
               
              
             
            
           
          
         
       
      
      
     
     
    
    
   
   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值