二叉树的创建与遍历(链式存储)

这里采用的是链式存储,每个结点包含三个属性(指向左右孩子的指针和本结点的数据),如果想了解顺序存储二叉树,可以参考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

posted @ 2016-12-19 20:21  寻觅beyond  阅读(868)  评论(2编辑  收藏  举报
返回顶部