数据结构_6:树:C语言_链式存储

  • 二叉树的数据结构
typedef struct BiTNode
{
    TElemType data;  //结点数据
    struct BiTNode *lchild,*rchild; //左右孩子指针
}BiTNode, *BiTree;
  • 创建空的二叉树
Status InitBiTree(BiTree *T)
{
    *T=NULL;
    return OK;
}
  • 创建二叉树
/* 按前序输入二叉树中结点的值(一个字符) */
/* #表示空树,构造二叉链表表示二叉树T。 */
void CreateBiTree(BiTree *T)
{ 
    TElemType ch;

    /* scanf("%c",&ch); */
    ch=str[index++];

    if(ch=='#') 
        *T=NULL;
    else
    {
        *T=(BiTree)malloc(sizeof(BiTNode));
        if(!*T)
            exit(OVERFLOW);
        (*T)->data=ch; /* 生成根结点 */
        CreateBiTree(&(*T)->lchild); /* 构造左子树 */ CreateBiTree(&(*T)->rchild); /* 构造右子树 */ } } 
  • 二叉树的深度
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 i>j?i+1:j+1;
}

数据结构_6:树:C语言_链式存储_第1张图片

  • 前序
void PreOrderTraverse(BiTree T)
{
     if(T==NULL)
       return;
     printf("%c",T->data);    // 显示结点的操作
     PreOrderTraverse(T->lchild);
      PreOrderTraverse(T->rchild);
}
  • 中序
void InOrderTraverse(BiTree T)
{
    if(T=NULL)
       return;
    InOrderTraverse(T->lchild);
    printf("%c",T->data);  
    InOrderTraverse(T->rchild);
}
  • 后续
void PostOrderTraverse(BiTree T)
{
    if(T=NULL)
       return;
    InOrderTraverse(T->lchild);
    InOrderTraverse(T->rchild);
    printf("%c",T->data);  
}
  • 中序遍历非递归
void Inorder2(BiTree T)
{
    InitStack(S);
    BiTree p=T;
    while(p|| IsEmpty(S))
    {
          if(p)
          {
              push(S,p);
              p=p->lchild;
          }
          else
          {
              Pop(S,p);
              visit(p);
              p=p->rchild;
          }
    }
}
  • 层次遍历
void LevelOrder(BiTree T)
{
    InitQueue(Q);   //初始化辅助队列
    BiTree p;       
    EnQueue(Q,T);   //将根结点插入队列
    While(!IsEmpty(Q))   //队列不空循环
    {
        DeQueue(Q,p);
        visit(p);
        if(p->lchild!=NULL)
           EnQueue(Q,p->lchild);   //左子树不空,则左树入队列
        if(p->rchild!=NULL)
           EnQueue(Q,p->rchild);   //右子树不空,则右子树入队列
    }
}
  • 测试程序
CreatBiTree(&T);

遍历构造二叉树的结果

  • 先序- ABCDEFGHI
  • 中序- BCAEDGHFI
1. A是根结点---左子树=BC;右子树=DEFGHI
2. B是左子树的根结点,D是右子书的根结点
3. 依次类推 -----------

你可能感兴趣的:(数据结构_6:树:C语言_链式存储)