数据结构基本知识点(二)
- 二叉树结点定义
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; } } } }