• [算法]二叉树专题


    二叉树结构

    struct BTnode
    {
        char m_val;
        BTnode *m_pl,*m_pr;
    };
    
    class BT
    {
        BTnode *m_proot;
        void create(BTnode *father,int k);
        void pre_travel_helper(BTnode *father);
        void post_travel_helper(BTnode *father);
        void mid_travel_helper(BTnode *father);
        void clear_BT_helper(BTnode *father);
    public:
        BT():m_proot(NULL){}
        void create_BT();
        void pre_travel();
        void post_travel();
        void mid_travel();
        void level_travel();
        void clear_BT();
    };

    二叉树函数

    void BT::create_BT(){
        if(m_proot!=NULL){
            return;
        }
        m_proot=new BTnode;
        cout<<"请输入根节点值"<<endl;
        cin>>m_proot->m_val;
        create(m_proot,1);//left
        create(m_proot,2);//right
    }
    
    //k=1表示创建左子节点,k=2为创建右子节点
    void BT::create(BTnode *father,int k){
        char tmp;
        if(k==1){
            cout<<father->m_val<<"左子节点值"<<endl;
            cin>>tmp;
            if(tmp!='0'){
                father->m_pl=new BTnode;
                father->m_pl->m_val=tmp;
                create(father->m_pl,1);
                create(father->m_pl,2);
            }else{
                father->m_pl=NULL;
            }
        }else{
            cout<<father->m_val<<"右子节点值"<<endl;
            cin>>tmp;
            if(tmp!='0'){//'0'为空子节点的标志
                father->m_pr=new BTnode;
                father->m_pr->m_val=tmp;
                create(father->m_pr,1);
                create(father->m_pr,2);
            }else{
                father->m_pr=NULL;
            }
        }
    }
    
    void BT::pre_travel(){
        if(m_proot==NULL){
            return;
        }
        pre_travel_helper(m_proot);
        cout<<endl;
    }
    
    void BT::post_travel(){
        if(m_proot==NULL){
            return;
        }
        post_travel_helper(m_proot);
        cout<<endl;
    }
    
    void BT::mid_travel(){
        if(m_proot==NULL){
            return;
        }
        mid_travel_helper(m_proot);
        cout<<endl;
    }
    
    void BT::pre_travel_helper(BTnode *father){
        if(father!=NULL){
            cout<<father->m_val<<" ";
        }else{
            return;
        }
        pre_travel_helper(father->m_pl);
        pre_travel_helper(father->m_pr);
    }
    
    void BT::post_travel_helper(BTnode *father){
        if(father==NULL){
            return;
        }
        post_travel_helper(father->m_pl);
        post_travel_helper(father->m_pr);
        cout<<father->m_val<<" ";
    
    }
    
    void BT::mid_travel_helper(BTnode *father){
        if(father==NULL){
            return;
        }
        mid_travel_helper(father->m_pl);
        cout<<father->m_val<<" ";
        mid_travel_helper(father->m_pr);
    }
    
    void BT::clear_BT(){
        if(m_proot==NULL){
            return;
        }
        clear_BT_helper(m_proot);
        cout<<endl;
    }
    
    void BT::clear_BT_helper(BTnode *father){
        BTnode *lson=NULL,*rson=NULL;
        if(father!=NULL){
            lson=father->m_pl;
            rson=father->m_pr;
            cout<<father->m_val<<"已被释放"<<endl;
            delete father;
            father=NULL;
        }else{
            return;
        }
        clear_BT_helper(lson);
        clear_BT_helper(rson);
    }
    
    void BT::level_travel(){
        stack<BTnode*> s1,s2;
        s1.push(m_proot);
        while(!s1.empty()){
            while(!s1.empty()){
                s2.push(s1.top());
                s1.pop();
            }
            while(!s2.empty()){
                BTnode *tmp=s2.top();
                cout<<tmp->m_val<<" ";
                if(tmp->m_pl!=NULL){
                    s1.push(tmp->m_pl);
                }
                if(tmp->m_pr!=NULL){
                    s1.push(tmp->m_pr);
                }
                s2.pop();
            }
        }
        cout<<endl;
    }

    比较两棵二叉树,相等返回1:

    int compare_BT(BTnode *tree1,BTnode *tree2){
        if(!tree1 && !tree2){//同时空子节点,则该子树相等
            return 1;
        }else if(!tree1 || !tree2){
            return 0;
        }
        if(tree1->m_val==tree2->m_val){
            if(compare_BT(tree1->m_pl,tree2->m_pl)){
                return compare_BT(tree1->m_pr,tree2->m_pr);
            }else if(compare_BT(tree1->m_pr,tree2->m_pl)){//左右子树对应相等也可
                return compare_BT(tree1->m_pl,tree2->m_pr);
            }
        }
        return 0;
    }

    连续存储方式:

    class BT_row
    {
        char *m_data;
        int m_maxlen;
        void pre_travel_helper(int n);
    public:
        BT_row():m_data(NULL),m_maxlen(0){}
        void init_tree(int maxlen,char *data);
        void clear_tree();
        void pre_travel();
        void post_travel();
        void mid_travel();
        void level_travel();
    };

    连续存储二叉树函数:

    void BT_row::init_tree(int maxlen,char *data){
        if(m_data!=NULL){
            return;
        }
        m_data=new char[maxlen];
        this->m_maxlen=maxlen;
        memcpy(m_data,data,maxlen*sizeof(char));
    }
    
    void BT_row::clear_tree(){
        if(m_data!=NULL){
            delete []m_data;
            m_data=NULL;
            m_maxlen=0;
        }
    }
    
    void BT_row::pre_travel(){
        pre_travel_helper(0);
        cout<<endl;
    }
    
    void BT_row::pre_travel_helper(int n){
        if(n>=m_maxlen){
            return;
        }
        if(m_data[n]!='0'){
            cout<<m_data[n]<<" ";
        }
        pre_travel_helper(2*n+1);//访问左子节点
        pre_travel_helper(2*n+2);//右子节点
    }
    
    void BT_row::level_travel(){
        int i;
        for(i=0;i<m_maxlen;++i){//连续存储的顺序就是按层遍历的顺序
            if(m_data[i]!='0'){
                cout<<m_data[i]<<" ";
            }
        }
        cout<<endl;
    }
  • 相关阅读:
    vs2015+opencv3.3.1 +Eigen 3.3.4 c++实现 薄膜插值 泊松图像编辑(v=0||Δf=0)
    vs2015+opencv3.3.1 实现 c++ 双边滤波器(Bilateral Filter)
    vs2015+opencv3.3.1 实现 c++ 彩色高斯滤波器(Gaussian Smoothing, Gaussian Blur, Gaussian Filter)
    vs2015+opencv3.3.1 实现 c++ 灰度高斯滤波器
    vs2015+opencv3.3.1 实现 c++ 直方图均衡化
    函数形参为基类数组,实参为继承类数组,下存在的问题------c++程序设计原理与实践(进阶篇)
    函数返回值string与返回值bool区别------c++程序设计原理与实践(进阶篇)
    (c++11)随机数------c++程序设计原理与实践(进阶篇)
    实现求解线性方程(矩阵、高斯消去法)------c++程序设计原理与实践(进阶篇)
    Centos ATI 显卡安装,“LCD 信号超出范围” 解决方法
  • 原文地址:https://www.cnblogs.com/iyjhabc/p/3248223.html
Copyright © 2020-2023  润新知