动态二叉树的先序、中序、后序和层序遍历及转换为静态二叉树
2017-12-25 18:29
393 查看
#include<stdio.h> #include<stdlib.h> static int length=0;//二叉树结点个数 typedef struct Array//静态二叉链表节点 { char data; int lchild; //存左孩子的下标 int rchild; //存右孩子的下标 }Array; Array Tree[20];//空的静态二叉树 typedef struct BiTNode //动态二叉链表节点 { char data; struct BiTNode *lchild,*rchild;//指向左右孩子的指针 }BiTNode,*BiTree; BiTree CreateBiTree()//按先序构造动态二叉树,空格表示空树 { char ch; BiTree T; scanf("%c",&ch); if(ch==' ') T=NULL; //空格表示空树 else { T=(BiTree)malloc(sizeof(BiTNode)); T->data=ch; //为根数据域赋值 T->lchild=CreateBiTree();//为左孩子数据域赋值 T->rchild=CreateBiTree();//为右孩子数据域赋值 } return T; } //先根遍历,递归实现 void PreTraversingBiTree(BiTree T) { if(T) { printf("%c",T->data); PreTraversingBiTree(T->lchild); PreTraversingBiTree(T->rchild); } } //中根遍历,递归实现 void MidTraversingBiTree(BiTree T) { if(T) { MidTraversingBiTree(T->lchild); printf("%c",T->data); MidTraversingBiTree(T->rchild); } } //后根遍历,递归实现 void PostTraversingBiTree(BiTree T) { if(T) { PostTraversingBiTree(T->lchild); PostTraversingBiTree(T->rchild); printf("%c",T->data); } } //求最大层数 int Maxdepth(BiTree T) { int left=0,right=0; if(T) { left=Maxdepth(T->lchild); //向左的最大层数 right=Maxdepth(T->rchild); //向右的最大层数 } return 1+(left>=right?left:right); } //层序遍历 void LevelTraversing(BiTree T,int level)//每层从左向右遍历 { if(T) { if(level==1) { printf("%c",T->data); Tree[++length].data=T->data;//层序遍历的同时给静态表赋值 } else { LevelTraversing(T->lchild,--level); LevelTraversing(T->rchild,level); } } } void LevelTraversingBiTree(BiTree T)//每层调用遍历函数 { int i=1; if(T) for(i;i<=Maxdepth(T);i++) LevelTraversing(T,i); } void BitreeTransform(BiTree T)//动态二叉树转换为静态二叉树 { int i,j; if(T) { for(j=1;T->data!=Tree[j].data;j++);//确定T结点的数组下标 if(T->lchild!=NULL) { for(i=1;T->lchild->data!=Tree[i].data;i++); Tree[j].lchild=i; //寻找并确定左孩子结点的数组下标 } else Tree[j].lchild=0; //没找到说明没有左孩子 if(T->rchild!=NULL) { for(i=1;T->rchild->data!=Tree[i].data;i++); Tree[j].rchild=i; //寻找并确定右孩子结点的数组下标 } else Tree[j].rchild=0; //没找到说明没有右孩子 BitreeTransform(T->lchild); BitreeTransform(T->rchild); } } int main() { printf("Input with order first:\n"); BiTree T; T=CreateBiTree(); printf("Preorder traversal:\t"); PreTraversingBiTree(T);printf("\n"); printf("Mid travelsal:\t\t"); MidTraversingBiTree(T);printf("\n"); printf("Post travelsal:\t\t"); PostTraversingBiTree(T);printf("\n"); printf("Level travelsal:\t"); LevelTraversingBiTree(T);printf("\n\n"); BitreeTransform(T); printf("static\n"); printf("index\tlchild\tdata\trchild\n"); for(int j=1;j<=length;j++) printf("%d\t%d\t%c\t%d\n",j,Tree[j].lchild,Tree[j].data,Tree[j].rchild); system("pause"); return 0; } //"ACB ED FG "
测试所用树
测试结果
相关文章推荐
- 二叉树的先序,中序,和后序遍历用静态和动态两种方法实现
- 二叉树的前序、中序、后序、层序遍历
- 二叉树的四种遍历方式 (前序,中序,后序,层序遍历 python实现)
- 二叉树的中序、先序、后序、层序遍历 & 二叉树的深度 & 节点查找
- 二叉树的各种操作:前序、中序、后序、层序遍历,二叉树搜索、插入和删除等操作
- 我强大的二叉树(先序、层序创建,先序、中序、后序、层序遍历)
- 二叉树的遍历方法之层序-先序-中序-后序遍历的简单讲解和代码示例
- 非递归遍历二叉树的四种策略-先序、中序、后序和层序
- 动态二叉树后序和中序建树并层序遍历
- Java实现二叉树的前序、中序、后序、层序遍历(递归方法)
- Java实现二叉树的前序、中序、后序、层序遍历(非递归方法)
- 【数据结构与算法】(六) c 语言实现简单的二叉树静态创建及先序、中序、后序遍历
- 二叉树创建及其遍历:前序、中序、后序、层序遍历等
- Java实现二叉树的前序、中序、后序、层序遍历(非递归方法)
- 二叉树的遍历:前序、中序、后序、层序的非递归实现
- 非递归遍历二叉树的四种策略-先序、中序、后序和层序
- 二叉树---实现先序、中序、后序和层序遍历
- 由二叉树的先序和中序遍历生成二叉树的层序和后序遍历结构
- 二叉树的前序、中序、后序、层序遍历
- 二叉树的遍历(前序、中序、后序、层序),递归和非递归实现