数据结构基本知识点(二)

  • 二叉树结点定义
typedef struct BTNode
{
    char data;
    struct BTNode *lchild;
    struct BTNode *rchild;
}BTNode;
  • 二叉树遍历之先序遍历

如果二叉树为空树,什么都不做。否则:1.访问根结点。2.先序遍历左子树。3.先序遍历右子树

void PreOrder(BTNode *p)
{
    if (p!=NULL)
    {
        visit(p);//假设访问函数visit()已经定义过
        PreOrder(p->lchild);
        PreOrder(p->rchild);
    }
}
  • 二叉树遍历之中序遍历
void InOrder(BTNode *p)
{
    if (p!=NULL)
    {
        InOrder(p->lchild);
        visit(p);//假设访问函数visit()已经定义过,其中包含了对结点P的各种操作。
        InOrder(p->rchild);
    }
}
  • 二叉树遍历之后序遍历
void PostOrder(BTNode *p)
{
    if (p!=NULL)
    {
        PostOrder(p->lchild);
        PostOrder(p->rchild);
        visit(p);//假设visit已经定义过,其中包含了对结点的各种访问操作
    }
}
  • 求二叉树深度
int getDepth(BTNode *p)
{
    int ld,rd;
    if (p==NULL)
    {
        return 0;
    }
    else 
    {
        ld=getDepth(p->lchild);
        rd=getDepth(p->rchild);
        return (ld>rd?ld:rd)+1;
    }
}
  • 二叉树之层次遍历

要进行层次遍历需要建立一个循环队列。先将二叉树头结点入队列,然后出队列,访问该结点,如果它有左子鼠,便将左子树根节点入队列,如果它有右子树,便将右子树根结点入队。然后出对了,对出队结点访问,如此反复,直到队列为空为止。

void level(BTNode *p)
{
    int front, rear;
    BTNode *que[maxSize];
    front=rear=0;
    BTNode *q;
    if (p!=NULL)
    {
        rear=(rear+1)%maxSize;
        que[rear]=p;//根节点入队
        while (front!=rear)
        {
            front=(front+1)%maxSize;
            q=que[front];
            visit(q);
            if (q->lchild!=NULL)
            {
                rear=(rear+1)%maxSize;
                que[rear]=q->lchild;
            }
            if (q->rchild!=NULL)
            {
                rear=(rear+1)%maxSize;
                que[rear]=q->rchild;
            }
        }
    }
}
原文地址:https://www.cnblogs.com/shinecox/p/3140327.html