树
树的遍历:
#include<stdio.h> #include<stdlib.h> typedef struct TNode *BinTree; typedef char ElementType; struct TNode{ ElementType Data; BinTree Left; BinTree Right; }; void CreateBinTree(BinTree *T){ char ch; scanf("%c",&ch); if(ch=='#') *T=NULL; else { *T=(BinTree)malloc(sizeof(TNode)); if(!*T) exit(-1); (*T)->Data=ch; CreateBinTree(&(*T)->Left); CreateBinTree(&(*T)->Right); } } void PostOrderTraverse(BinTree T)//后序遍历 { if(T==NULL) return; PostOrderTraverse(T->Left); PostOrderTraverse(T->Right); printf("%c ",T->Data); } int main() { BinTree T; CreateBinTree(&T); printf("\n"); PostOrderTraverse(T); return 0; }
树的按层遍历:
//层次遍历二叉树并输出结点的算法 #include <stdio.h> #include <stdlib.h> typedef struct NNode { char data; struct NNode *LChild; struct NNode *RChild; } BiTNode,*BiTree; //定义二叉树结点和结点指针 typedef BiTree QueueElementType; typedef struct Node { QueueElementType data; struct Node *next; } LinkQueueNode; //定义队列结点 typedef struct { LinkQueueNode *front; //队列头结点指针 LinkQueueNode *rear; //队列尾结点指针 } LinkQueue; //定义队列 int InitQueue(LinkQueue *Q ) //初始化队列 { Q->front=(LinkQueueNode * )malloc(sizeof(LinkQueueNode)); if(Q->front != NULL) { Q->rear=Q->front; Q->front->next=NULL; return 1; } else return 0; //溢出 } int EnterQueue(LinkQueue *Q,QueueElementType x) //元素x入链队列 尾插法 { LinkQueueNode * newnode; newnode=(LinkQueueNode *) malloc(sizeof(LinkQueueNode)); if(newnode != NULL) { newnode->data=x; newnode->next=NULL; Q->rear->next=newnode; Q->rear=newnode; return 1; } else return 0; } int DeleteQueue(LinkQueue *Q,QueueElementType *x ) //链队列出队 从开始的头开始取 { LinkQueueNode *p; if(Q->front==Q->rear) return 0; p=Q->front->next; Q->front->next=p->next; if(Q->rear==p ) Q->rear=Q->front; //如果去掉结点p后,队列为空 不要忘记将队列置空 *x=p->data; free(p); return 1; } int IsEmpty(LinkQueue *Q) //队列为空返回1 不为空返回0 { if(Q->front==Q->rear ) return 1; else return 0; } void CreateBiTree(BiTree *bt) //用先序遍历创建二叉树 { char ch; ch=getchar(); if(ch=='#') (*bt)=NULL; else { *bt=(BiTree)malloc(sizeof(BiTNode)); (*bt)->data=ch; CreateBiTree(&((*bt)->LChild)); CreateBiTree(&((*bt)->RChild)); } } void PreOrder(BiTree root) //先序遍历二叉树 { if(root!=NULL) { printf("%c",root->data); PreOrder(root->LChild); PreOrder(root->RChild); } } int LayerOrder(BiTree bt) //层次遍历二叉树 成功遍历返回1 失败返回0 { LinkQueue Q; BiTree p; InitQueue(&Q); if(bt==NULL) return 0; EnterQueue(&Q,bt); while(!IsEmpty(&Q)) { if(DeleteQueue(&Q,&p)); printf("%c ",p->data); if(p->LChild) EnterQueue(&Q,p->LChild); if(p->RChild) EnterQueue(&Q,p->RChild); } return 1; } int main() { BiTree bt; printf("用先序遍历创建二叉树 请输入树的内容 形式如AB..CD...的格式\n") ; CreateBiTree(&bt); PreOrder(bt); printf("\n"); if(LayerOrder(bt)) printf("层次遍历成功\n"); else printf("层次遍历失败\n"); return 0; }