1.已知完全二叉树的层次遍历,求其前、中、后序
测试样例:
)
对于例1:
前序遍历:ABDGIJKLCEFH
中序遍历:DIGJLKBAECHF
后序遍历:ILKJGDBEHFCA
对于例2:
前序遍历:eadcbjfghi
中序遍历:abcdjefhgi
后序遍历:bcjdahigfe
//用顺序存储的方法将完全二叉树中的所有结点逐层存放在数组中R[1..n]
//若R[i]若有左结点,则左孩子的 结点编号为R[2i];若有右结点,则右孩子的编号为R[2i+1](证明暂略)
//0~n-1,R[2i+1],R[2i+2]
#include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXSIZE 100+1 void Preordertraverse(char *data,int i)//中左右 { if(data[i] == '#' || i >= strlen(data)) return; putchar(data[i]); Preordertraverse(data,2*i+1); Preordertraverse(data,2*i+2); } void Inordertraverse(char *data,int i)//左中右 { if(data[i] == '#' || i >= strlen(data)) return; Inordertraverse(data,2*i+1); putchar(data[i]); Inordertraverse(data,2*i+2); } void Postordertraverse(char *data,int i)//左右中 { if(data[i] == '#' || i >= strlen(data)) return; Postordertraverse(data,2*i+1); Postordertraverse(data,2*i+2); putchar(data[i]); } int main() { char data[MAXSIZE]; printf("完全二叉树的所有结点(以'#'代替空):"); gets(data); //前 中 后序遍历 printf("前序遍历:"); Preordertraverse(data,0); printf(" 中序遍历:"); Inordertraverse(data,0); printf(" 后序遍历:"); Postordertraverse(data,0); printf(" "); return 0; }
//ABCD#EF#G####H###IJ###################K######################################L
//eaf#d#g##cj##hi####b
//R[0..n-1] ,R[2*i+1],R[2*i+2] #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXSIZE 100+1 typedef struct node{ char data; struct node *lchild,*rchild; }bitree,*bitnode; void Create_bitree(bitnode &bt,char *data,int i)//递归建树 { if(i >= strlen(data) || data[i] == '#' || data[i] == '