二叉树的建立和遍历

来源:互联网 发布:制作卡通人物的软件 编辑:程序博客网 时间:2024/06/06 21:25
一.建立(以‘#’作为空子节点)
1.前序建立,递归思想
注意输入时要将每一个非空节点的子节点写为空才可结束递归,例如输入ABCD#E####
typedef struct BiTNode{struct BiTNode *lchild;struct BiTNode *rchild;char data;} BiTreeNode, *BiTree;BiTree Create(BiTree &S){    char a;    cin>>a;    if (a== '#')S = NULL;else{S=(BiTNode *)malloc(sizeof(BiTNode));S->data = a;S->lchild = Create(S->lchild);S->rchild = Create(S->rchild);}return S;}
2.由已知的字符串按照满二叉树结构建立二叉树
例如 ABCD##E
显然以前序建立的方法不能满足要求,所以建立采用了以下方法,主要用了一个字符串来储存字符串,然后依次建立,思想也是递归
void Create(BiTree *&s,char a[],int n){    if(n>=strlen(a)||a[n]=='#')s=NULL;    else    {        s=(BiTNode*)malloc(sizeof(BiTNode));        s->data=a[n];        Create(s->lchild,a,2*n+1);        Create(s->rchild,a,2*(n+1));    }}
3.数组存储,但因为很容易浪费空间,此处不做赘述
二.遍历
三种:前序,中序,后序
前序:根节点,左子树,右子树
中序:左子树,根节点,右子树
后序:左子树,右子树,根节点                               
举例
前序:ABDEGCFH       中序:DBGEACHF      后序:DGEBHFCA
代码实现,三种遍历此处都用递归来实现
void Preorder(BiTree *&s)//前序遍历{    if(s)    {        cout<<s->data<<' ';        Preorder(s->lchild);        Preorder(s->rchild);    }}void Midorder(BiTree *&s)//中序遍历{    if(s)    {        Midorder(s->lchild);        cout<<s->data<<' ';        Midorder(s->rchild);    }}void Postorder(BiTree *&s)//后序遍历{    if(s)    {        Postorder(s->lchild);        Postorder(s->rchild);        cout<<s->data<<' ';    }}

0 0
原创粉丝点击