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

Posted 寻觅beyond

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树的创建与遍历(链式存储)相关的知识,希望对你有一定的参考价值。

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

以上是关于二叉树的创建与遍历(链式存储)的主要内容,如果未能解决你的问题,请参考以下文章

数据结构_011_二叉树的创建和遍历

二叉树链式存储和遍历

数据结构 二叉树

数据结构-二叉树的存储结构与遍历

二叉树的存储方式和遍历方式

二叉树的存储方式和遍历方式