二叉树分为三种遍历方式:
--这里说的序是针对根节点的。
1.先序遍历:根——左——右
2.中序遍历:左——根——右
3.后序遍历:左——右——根
//作为 kai1.h 头文件 #include<stdio.h>//输入输出流 #include<stdlib.h>//标准库 typedef struct node { char data; struct node *lchild; struct node *rchild; }*bitree,bitnode; //构造一个新的二叉树 bitree initbitree(bitnode *root) { bitree tree=root; return tree; } //生成节点包含数据域和左右孩子 bitnode *makenode(char item, bitnode *lchild,bitnode *rchild) { bitnode *pnode=(bitnode*)malloc(sizeof(bitnode)); if(pnode) { pnode->data=item; pnode->lchild=lchild; pnode->rchild=rchild; } return pnode; } //释放节点 void freenode(bitnode *pnode) { if(pnode!=NULL) free(pnode); } //销毁二叉树 void destorybitnode(bitree tree) { bitnode *pnode=tree; if(pnode->lchild!=NULL) { destorybitnode(pnode->lchild); } if(pnode->rchild!=NULL) { destorybitnode(pnode->rchild);//递归调用 } freenode(pnode); } //判断是否为空 int isempty(bitree tree) { if(tree==NULL) return 0; else return 1; } //返回树的深度 int GetDepth(bitree tree) { int cd,ld,rd; cd=ld=rd=0; if(tree) { ld=GetDepth(tree->lchild); rd=GetDepth(tree->rchild); cd=(ld>rd?ld:rd); return cd+1; } else { return 0; } } //返回根 bitree get(bitree tree) { return tree; } //返回节点值 int getint(bitnode *pnode) { return pnode->data; } //设置节点值 void setint(bitnode *pnode, int item) { pnode->data=item; } //设置左子树 bitree setlchild(bitree parent,bitree lchild) { parent->lchild=lchild; return lchild; } //设置右子树 bitree setrchild(bitree parent,bitree rchild) { parent->rchild=rchild; return rchild; } //返回左子树 bitree getlchild(bitree tree) { if(tree!=NULL) return tree->lchild; else return NULL; } //返回右子树 bitree getrchild(bitree tree) { if(tree!=NULL) return tree->rchild; else return NULL; } //插入新的子树,lr为0插入左子树,为1插入右子树 bitree insertchild(bitree parent,int lr,bitree child) { if(parent) { if(lr==0&&parent->lchild==NULL) { parent->lchild=child; return child; } if(lr==1&&parent->rchild==NULL) { parent->rchild=child; return child; } } } //删除子树lr为0删除左子树,为1删除右子树 void deletechild(bitree parent,int lr) { if(parent) { if(lr=0 && parent->lchild!=NULL) { parent->lchild=NULL; freenode(parent->lchild);//释放空间 } if(lr=1 && parent->rchild!=NULL) { parent->rchild=NULL; free(parent->rchild); } } }
#include"kai1.h" void preordertravers(bitnode *root) { if(root) { printf("%c ",root->data); preordertravers(root->lchild); preordertravers(root->rchild); } } //中序遍历 void inordertravers(bitnode *root) { if(root) { inordertravers(root->lchild); printf("%c ",root->data); inordertravers(root->rchild); } } //后序遍历 void postordertravers(bitnode *root) { if(root) { postordertravers(root->lchild); postordertravers(root->rchild); printf("%c ",root->data); } } int main() { bitnode *G=makenode('G',NULL,NULL); bitnode *H=makenode('H',NULL,NULL); bitnode *I=makenode('I',NULL,NULL); bitnode *J=makenode('J',NULL,NULL); bitnode *D=makenode('D',NULL,G); bitnode *E=makenode('E',H,I); bitnode *F=makenode('F',NULL,J); bitnode *B=makenode('B',D,E); bitnode *C=makenode('C',F,NULL); bitnode *A=makenode('A',B,C); printf("先序遍历:"); preordertravers(A);//A是根节点 printf("\n"); printf("中序遍历:"); inordertravers(A);//A是根节点 printf("\n"); printf("后序遍历:"); postordertravers(A);//A是根节点 printf("\n"); return 0; }