zoukankan      html  css  js  c++  java
  • 二叉树的创建与遍历(链式存储)

    这里采用的是链式存储,每个结点包含三个属性(指向左右孩子的指针和本结点的数据),如果想了解顺序存储二叉树,可以参考http://www.cnblogs.com/-beyond/p/6065189.html

    采用先序递归创建二叉树,叶子的左右孩子链域为NULL

    输入的顺序为:abd--e--c-f--   (-表示空一个空格)

    #include<iostream>
    #include<cstdio>
    using namespace std;
    
    struct BiTNode{
        BiTNode *lchild,*rchild;
        char data;
    };
    typedef BiTNode *BiTree;
    const char Nil=' ';//默认值
    const int maxn=100;
    
    //初始化
    void InitBiTree(BiTree &T){
        T=NULL;
    }
    
    //销毁
    void DestoryBiTree(BiTree &T){
        if(T){//树不为空
            if(T->lchild){//递归方法销毁左子树
                DestoryBiTree(T->lchild);
            }
            if(T->rchild){//递归方法销毁右子树
                DestoryBiTree(T->rchild);
            }
            delete(T);
            T=NULL;
        }
    }
    
    //此代码段没有调用
    void Visit(char value){
        cout<<value<<' ';
    }
    
    //先序递归遍历
    void PreOrderTraverse(BiTree T){
        if(T){
            cout<<T->data<<' ';
            PreOrderTraverse(T->lchild);
            PreOrderTraverse(T->rchild);
        }
    }
    
    //中序递归遍历
    void InOrderTraverse(BiTree T){
        if(T){
            InOrderTraverse(T->lchild);
           cout<<T->data<<' ';
            InOrderTraverse(T->rchild);
        }
    }
    
    //后序递归遍历
    void PostOrderTraverse(BiTree T){
        if(T){
            PostOrderTraverse(T->lchild);
            PostOrderTraverse(T->rchild);
            cout<<T->data<<' ';
        }
    }
    
    //先序递归建立二叉树
    void CreateBiTree(BiTree &T){
        char ch;
        scanf("%c",&ch);
        if(ch==Nil){
            T=NULL;
        }
        else {
            T=new BiTNode;
            if(!T){
                cout<<"申请内存失败"<<endl;
            }
            T->data=ch;
            CreateBiTree(T->lchild);
            CreateBiTree(T->rchild);
        }
    }
    
    //判断二叉树是否为空
    bool EmptyBiTree(BiTree T){
        if(T){
            return false;
        }
        return true;
    }
    
    //返回二叉树的深度
    int BiTreeDepth(BiTree T){
        int i,j;
        if(!T){
            return 0;
        }
        if(T->lchild){
            i=BiTreeDepth(T->lchild);
        }
        else i=0;
        if(T->rchild){
            j=BiTreeDepth(T->rchild);
        }
        else j=0;
        return 1+(i>j?i:j);
    }
    
    //返回根
    char GetRoot(BiTree T){
        if(EmptyBiTree(T)){
            return Nil;
        }
        return T->data;
    }
    
    //返回结点的值
    char GetValue(BiTree p){
        return p->data;
    }
    
    //给节点赋值
    char Assign(BiTree p,char value){
        p->data=value;
    }
    
    int main(){
        BiTree T;
        InitBiTree(T);
        CreateBiTree(T);
        
        cout<<"先序遍历"<<endl;
        PreOrderTraverse(T);
        
        cout<<endl<<"中序遍历"<<endl;
        InOrderTraverse(T);
        
        cout<<endl<<"后序遍历"<<endl;
        PostOrderTraverse(T);
        
        cout<<endl<<"树的根为"<<endl;
        cout<<GetRoot(T)<<endl;
        
        cout<<"深度"<<endl;
        cout<<BiTreeDepth(T)<<endl;
    }
    

    测试数据:

    abd__e__c_f__

    结果:

    过程中有点小问题,很容易被忽略的:在创建二叉树的时候,输入单个字符的时候不要用cin,应该用scanf

  • 相关阅读:
    SQLiteDatabase 源码
    SQLiteOpenHelper 源码
    Java同步机制总结--synchronized
    [Swift A]
    [Swift A]-问号&感叹号
    [Swift A]
    [Swift A]
    android 屏幕适配
    2014年度加班时间
    nodejs初学-----helloworld
  • 原文地址:https://www.cnblogs.com/-beyond/p/6200478.html
Copyright © 2011-2022 走看看