数据结构——二叉树

1.二叉树的遍历(traversing binary tree):

从根结点出发,按照某种次序依次访问各个结点,且每个结点有且仅被访问一次。

1)前序遍历:先访问各个根结点,顺序遍历左子树,再顺序遍历右子树。输出第一个为根节点。
2)中序遍历:从根节点开始,先遍历左子树,然后是遍历右子树,最后是节点;

3)后序遍历:先从左到右遍历叶子,然后到分支节点,最后是根节点。

2二叉树的建立

叶子的指针域是指向NULL的,但在建立二叉树时,需要判断该节点是否有左右孩子节点,因此将叶子结点的lchild和rchild指针指向一个虚拟的节点,并赋予特定的值来表示结束,以便于插入新的结点。

#include<stdio.h>
#include<stdlib.h>

#define endmark 1000//定义叶子的结束标志

typedef int Elemtype ;

typedef struct treenode//创建树节点的结构体
{
    Elemtype data;
    struct treenode * lchild;
    struct treenode * rchild;
}treenode,*tree;

void creattree(tree (*treeptr))//前序遍历
{
    Elemtype temp;//缓存输入
    tree ptr;
    scanf("%d",&temp);
    if (temp==endmark)
    {
        *treeptr = NULL;
        return;
    }
    else
    {
        ptr = (tree)malloc(sizeof(treenode));
        ptr->data=temp;
        *treeptr = ptr;
        creattree(&(*treeptr)->lchild);//对左子树赋值
        creattree(&(*treeptr)->rchild);//对右子树赋值
    }

}


void PreOrderTraverse(tree treeptr)//前序遍历
{
    if (treeptr==NULL)
    {
        return;
    }
    else
    {
        printf("%d\n",treeptr->data);
        PreOrderTraverse(treeptr->lchild);//对左子树赋值
        PreOrderTraverse(treeptr->rchild);//对右子树赋值
    }

}

void InOrderTraverse(tree treeptr)//中序遍历
{
    if (treeptr==NULL)
    {
        return;
    }
    else
    {       
        InOrderTraverse(treeptr->lchild);//对左子树赋值
        printf("%d\n",treeptr->data);
        InOrderTraverse(treeptr->rchild);//对右子树赋值
    }

}

void PostOrderTraverse(tree treeptr)//后序遍历
{
    if (treeptr==NULL)
    {
        return;
    }
    else
    {       
        PostOrderTraverse(treeptr->lchild);//对左子树赋值

        PostOrderTraverse(treeptr->rchild);//对右子树赋值
        printf("%d\n",treeptr->data);
    }

}

void main()
{
    tree treehead=NULL;
    creattree(&treehead);//创建二叉树
    printf("\n前序输出\n");
    PreOrderTraverse((treehead));
    printf("\n中序序输出\n");
    InOrderTraverse(treehead);

    printf("\n后序输出\n");
    PostOrderTraverse(treehead);
    system("pause");


}

其中1000为结束标志 输入1、2、3、1000、1000、4、1000、1000、5、6、1000、1000、7、1000、1000

顺序输出为:1、2、3、4、5、6、7
中序输出为:3、2、4、1、6、5、7
后序输出为:3、4、2、6、7、5、1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值