首页 > 代码库 > 二叉树的创建与遍历(链式存储)

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

这里采用的是链式存储,每个结点包含三个属性(指向左右孩子的指针和本结点的数据),如果想了解顺序存储二叉树,可以参考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=http://www.mamicode.com/ch;"先序遍历"<<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

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