栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

二叉树的基本操作(C++实现)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

二叉树的基本操作(C++实现)

编译器是DevC++。可能有地方写得不够规范,大佬轻喷。

//链式存储的二叉树 
//先序建立方式
//遍历方式:先序,中序,后序,层次 
//计算:树的深度,叶子节点,节点数,度为1的节点数,度为2的节点数
//二叉树的复制,交换左右子树
//二叉树的查找,修改,删除,插入 


#include
#include
#include

using namespace std;

int n;

typedef struct Node{
    
    int data;
    Node *lchild,*rchild;
    
}LkNode,*BiTree;


void CreateBiTree(BiTree &T){
    
    int inputdata;
    cin>>inputdata;
    if(inputdata == -1){
        
        T = NULL;
        //return;
        
    }
    
    else{
        
        T = new LkNode();
        if(!T)
            cout<<"开辟空间失败!"<data = inputdata; //创建根节点
            CreateBiTree(T ->lchild);
            CreateBiTree(T ->rchild);
            
        }
        
    }
    
}


void PreOrederTraverse(BiTree T){ //递归实现先序遍历 
    
    if(T != NULL){
        
        cout<data<<" ";
        PreOrederTraverse(T ->lchild);
        PreOrederTraverse(T ->rchild);
        
    }
    else{
        
        //cout<<"二叉树为空!"<lchild);
        cout<data<<" ";
        MidOrederTraverse(T ->rchild);
         
    }
    else{
        
        //cout<<"二叉树为空!"<lchild);
        LastOrederTraverse(T ->rchild);
        cout<data<<" ";
         
    }
    else{
        
        //cout<<"二叉树为空!"< que;
    if(T != NULL){
        
        while(T){

            cout << T->data << " ";

            if(T->lchild)
                que.push(T->lchild);
            if(T->rchild)
                que.push(T->rchild);
            if(que.empty())
                break;

            T = que.front(); //将队列首元素赋予T, 
            que.pop();

        }
        
    }
    else{
        
        //cout<<"二叉树为空!"<lchild);
        depr = DepthBiTree(T ->rchild);
        dep = 1 + (depl > depr ? depl : depr);
        return dep;
            
    }
    
}


int NodeCount(BiTree T){ //计算节点数 
    
    int nodecount = 0;
    if(!T)
        return 0;
    else{
        
        //return NodeCount(T ->lchild) +NodeCount(T ->rchild) + 1;
        nodecount++;
        
        nodecount += NodeCount(T ->lchild);
        nodecount += NodeCount(T ->rchild);
        
    }
    return nodecount;
        
}


int LeafCount(BiTree T){ //计算叶子节点数 
    
    int leafcount = 0;
    if(!T)
        return 0;
    else{
        
        if( (!T ->lchild) && (!T ->rchild) ) //左右子树均为空,则为叶子节点 
            //leafcount++; //两种写法都可以 
            leafcount = 1;
        
        leafcount += LeafCount(T ->lchild);
        leafcount += LeafCount(T ->rchild);
            
    }
    return leafcount;
    
}
    

int SinglePointCount(BiTree T){ //计算度为1的节点数
    
    int sgcount = 0;
    if(!T)
        return 0;
    else{
        
        if( T ->lchild && T ->rchild ){ //左右节点都不为空,则分别计算左右子树度为1的节点个数 
            
            sgcount += SinglePointCount(T ->lchild);
            sgcount += SinglePointCount(T ->rchild);
            
        }
        if( T ->lchild && (!T ->rchild) ){ //左节点不为空,计算左子树度为1的节点个数 
            
            sgcount++;
            sgcount += SinglePointCount(T ->lchild);
            
        }
        if( (!T ->lchild) && T ->rchild ){ //右节点不为空,计算右子树度为1的节点个数 
            
            sgcount++;
            sgcount += SinglePointCount(T ->rchild);
            
        }
        
    }
    return sgcount;
        
}


int DoublePointCount(BiTree T){ //计算度为2的节点数 
    
    int dbcount = 0;
    if(!T)
        return 0;
    else{
        
        if( T ->lchild && T ->rchild ) //左右子树均不为空,则度为2
            dbcount++;
        
        dbcount += DoublePointCount(T ->lchild);
        dbcount += DoublePointCount(T ->rchild);
        
    }
    return dbcount;
    
}
        

void SwapBiTree(BiTree &T){ //交换左右子树所有节点 
    
    BiTree tem = new LkNode();
    if(T){
        
        tem = T ->rchild;
        T ->rchild = T ->lchild;
        T ->lchild = tem;
        
        SwapBiTree(T ->lchild);
        SwapBiTree(T ->rchild);
        
    }
    else return;
    
}


void CopyBiTree(BiTree T,BiTree &T2){ //复制二叉树 
    
    T2 = new LkNode();
    if(T){
        
        T2 ->data = T ->data;
        CopyBiTree(T ->lchild,T2 ->lchild);
        CopyBiTree(T ->rchild,T2 ->rchild);
        
    }
    else{
        
        T2 = NULL;
        return;
        
    }
    
}


bool SearchNode(BiTree T,int search){ //查找节点 
    
    if(T){
        
        if(T ->data == search){
            
            cout<<"节点"<lchild && T ->rchild){
                
                cout<<"且节点"<lchild ->data;
                cout<<",右孩子为"<rchild ->data<<"。"<lchild && (!T ->rchild)){
                
                cout<<"且节点"<lchild ->data;
                cout<<",右孩子为空。"<lchild) && T ->rchild){
                
                cout<<"且节点"<rchild ->data<<"。"<lchild,search);
            if(flag)
            {}
            else
                SearchNode(T ->rchild,search);
            
        }
        
    }
    else
        return false;
    
}


void GetParent(BiTree T,int search){ //查找父节点 
    
    if(T ->lchild){
        
        if(T ->lchild ->data == search){
            
            cout<<"节点"<data<<"的左孩子。"<lchild,search);
            
    }
    if(T ->rchild){
        
        if(T ->rchild ->data == search){
            
            cout<<"节点"<data<<"的右孩子。"<rchild,search);
            
    }
    if( (!T ->lchild) && (!T ->rchild) )
        return;
        
}


bool UpdateNode(BiTree &T,int update){ //修改节点 
    
    if(T){
        
        if(T ->data == update){
            
            int update2;
            cout<<"节点"<>update2;
            
            T ->data = update2;
            return true; 
            
        }
        else{
            
            bool flag = UpdateNode(T ->lchild,update);
            if(flag)
            {}
            else
                UpdateNode(T ->rchild,update);
            
        }
        
    }
    else
        return false;
    
}


bool DeleteNode(BiTree &T,int dlt){ //删除节点
    
    if(T){
        
        if(T ->data == dlt){
            
            if(T ->lchild && T ->rchild){ //用左孩子替代原节点,右孩子变成左孩子的左孩子 
                
                BiTree tem = T ->rchild;
                T = T ->lchild; //可以写个if,左右节点谁大谁替代原节点 
                T ->lchild = tem;
                T ->rchild = NULL;
                
            }
            else if(T ->lchild && (!T ->rchild)){ //用左孩子替代原节点 
                
                T = T ->lchild;
                
            }
            else if((!T ->lchild) && T ->rchild){ //用右孩子替代原节点 
                
                T = T ->rchild;
                
            }
            else
                T = NULL;
            
            //T = NULL; //连同左右孩子一起删除 
            return true; 
            
        }
        else{
            
            bool flag = DeleteNode(T ->lchild,dlt);
            if(flag)
            {}
            else
                DeleteNode(T ->rchild,dlt);
            
        }
        
    }
    else
        return false;
    
}


bool InsertNode(BiTree &T,int istparent){ //删除节点
    
    if(T){
        
        if(T ->data == istparent){
            
            int istdata;
            if(T ->lchild && T ->rchild){ //选择插入为原节点的左孩子或右孩子 
                
                cout<<"父节点左右孩子均存在,输入0代表插入为左孩子,输入1代表插入为右孩子。";
                cout<>lr;
                
                if(lr == 0){
                    
                    cout<<"请输入要插入的数据:";
                    cin>>istdata;
                    BiTree tem = new LkNode(); //开辟新空间
                     
                    tem ->data = istdata;
                    tem ->lchild = T ->lchild; //插入后原节点的左孩子,变成现节点的左孩子
                    tem ->rchild = NULL;
                    T ->lchild = tem;
                    
                }
                else if(lr == 1){
                
                    cout<<"请输入要插入的数据:";
                    cin>>istdata;
                    BiTree tem = new LkNode();
                     
                    tem ->data = istdata;
                    tem ->rchild = T ->rchild; //插入后原节点的右孩子,变成现节点的右孩子
                    tem ->lchild = NULL;
                    T ->rchild = tem;
                    
                }
                else
                    cout<<"插入为空。"<lchild && (!T ->rchild)){ //插入为原节点的右孩子 
                
                cout<<"父节点左孩子存在,右孩子为空,默认插入为右孩子,请输入要插入的数据:";
                cin>>istdata;
                BiTree tem = new LkNode();
            
                tem ->data = istdata;
                T ->rchild = tem; 
                
            }
            else if((!T ->lchild) && T ->rchild){ //插入为原节点的左孩子 
                
                cout<<"父节点左孩子为空,右孩子存在,默认插入为左孩子,请输入要插入的数据:";
                cin>>istdata;
                BiTree tem = new LkNode();
            
                tem ->data = istdata;
                T ->lchild = tem;
                
            }
            else{
                
                cout<<"父节点左右孩子均不存在,默认插入为左孩子,请输入要插入的数据:";
                cin>>istdata;
                
                BiTree istl = new LkNode();
                istl ->data = istdata;
                //istl ->lchild = NULL;
                //istl ->rchild = NULL;
                T ->lchild = istl;
                
            }
            
            return true; 
            
        }
        else{
            
            bool flag = InsertNode(T ->lchild,istparent);
            if(flag)
            {}
            else
                InsertNode(T ->rchild,istparent);
            
        }
        
    }
    else
        return false;
    
}


int main(){
    
    while(1){
        
        BiTree tree = NULL; //创建从根节点开始的二叉树
         
        cout<<"请输入二叉树tree的节点:";
        CreateBiTree(tree);
        cout<<"二叉树tree创建成功!"<>srh;
        if(SearchNode(tree,srh)){
        
            if(tree ->data == srh)
                cout<<"节点"<>upt;
        if(UpdateNode(tree,upt)){
        
            cout<<"修改成功!修改后tree层次遍历的顺序为:";
            LevelTraverse(tree); 
            cout<>dlt;
        if(DeleteNode(tree,dlt)){
        
            cout<<"删除成功!删除后tree层次遍历的顺序为:";
            LevelTraverse(tree); 
            cout<>istparent;
        if(InsertNode(tree,istparent)){
        
            cout<<"插入成功!插入后tree层次遍历的顺序为:";
            LevelTraverse(tree); 
            cout< 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/921096.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号