码迷,mamicode.com
首页 > 其他好文 > 详细

二叉树1

时间:2016-05-10 09:49:54      阅读:249      评论:0      收藏:0      [点我收藏+]

标签:

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("\n中序遍历:");
    Inordertraverse(data,0);
    printf("\n后序遍历:");
    Postordertraverse(data,0);
    printf("\n");
    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] == \0)    bt = NULL;
    else{
        bt->data = data[i];
        bt->lchild = (bitree *)malloc(sizeof(bitree)); 
        bt->rchild = (bitnode)malloc(sizeof(bitree));
        Create_bitree(bt->lchild,data,2*i+1);
        Create_bitree(bt->rchild,data,2*i+2);
    }
}
void Preordertraverse(bitree *bt)//中左右 
{
    if(!bt) return;
    putchar(bt->data);
    Preordertraverse(bt->lchild);
    Preordertraverse(bt->rchild);
}
void Inordertraverse(bitree *bt)//左中右 
{
    if(!bt) return;
    Inordertraverse(bt->lchild);
    putchar(bt->data);
    Inordertraverse(bt->rchild);
}
void Postordertraverse(bitree *bt)//左右中 
{
    if(!bt) return;
    Postordertraverse(bt->lchild);
    Postordertraverse(bt->rchild);
    putchar(bt->data);
}
int main()
{
    bitree *bt = (bitree *)malloc(sizeof(bitree));
    char data[MAXSIZE];
    printf("完全二叉树的所有结点(以‘#‘代替空):");
    gets(data); 
    Create_bitree(bt,data,0);
    //前 中 后序遍历 
    printf("前序遍历:");
    Preordertraverse(bt);
    printf("\n中序遍历:");
    Inordertraverse(bt);
    printf("\n后序遍历:");
    Postordertraverse(bt);
    printf("\n");
    return 0;
}

//注意到:由于结点个数随着层数呈指数级增长,当层数过大而空结点较多时,能否不用数组辅助实现???请知道的朋友不吝告知

 

二叉树1

标签:

原文地址:http://www.cnblogs.com/520xiuge/p/5476618.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!