二叉树详解-1

树是一种比较重要的数据结构,尤其是二叉树。二叉树是一种特殊的树,在二叉树中每个节点最多有两个子节点,一般称为左子节点和右子节点(或左孩子和右孩子),并且二叉树的子树有左右之分,其次序不能任意颠倒。二叉树是递归定义的,因此,与二叉树有关的题目基本都可以用递归思想解决,当然有些题目非递归解法也应该掌握,如非递归遍历节点等等。本文努力对二叉树相关题目做一个较全的整理总结。

这是一个树的基本结构

typedef struct node{

    struct node * lchild;

    struct node * rchild;

    int  data;//可以换成任意数据类型

}BiTNode,*BiTree;

 

基本接口如下

/*生成节点*/

BiTNode *MakeNode(int 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);

}

 

//设置左子树

BiTree SetLChild(BiTree parent,BiTree lchild)

{

    parent->lchild = lchild;

    return lchild;

}

 

/*设置右子树*/

BiTree SetRChild(BiTree parent,BiTree rchild)

{

    parent->rchild = rchild;

    return rchild;

}

下面开始二叉树的操作:

1.创建二叉树

   //节点数据

        BiTNode * n1 = MakeNode(10,NULL,NULL);

        BiTNode * n2 = MakeNode(20,NULL,NULL);

        BiTNode * n3 = MakeNode(30,n1,n2);

        BiTNode * n4 = MakeNode(40,NULL,NULL);

        BiTNode * n5 = MakeNode(50,NULL,NULL);

        BiTNode * n6 = MakeNode(60,n4,n5);

        BiTNode * n7 = MakeNode(70,NULL,NULL);

 

        //1.生成2叉树

        BiTree rootTree = InitBiTree(n7);

        SetLChild(rootTree, n3);

        SetRChild(rootTree, n6);

   2.遍历二叉树

  

//前序遍历

void PreOrderTraverse(BiTree pRoot)

{

    if(pRoot == NULL)

        return;

    printf("%d,",pRoot->data); // 访问根节点

    PreOrderTraverse(pRoot->lchild); // 前序遍历左子树

    PreOrderTraverse(pRoot->rchild); // 前序遍历右子树

}

 

//中序遍历

void InOrderTraverse(BiTree pRootNode)

{

    if(pRootNode == NULL)

    {

        return;

    }

    InOrderTraverse(pRootNode->lchild);

    printf("%d,",pRootNode->data);

    InOrderTraverse(pRootNode->rchild);

}

 

//后序遍历

void PostorderOrderTraverse(BiTree pRootNode)

{

    if(pRootNode == NULL)

    {

        return;

    }

    PostorderOrderTraverse(pRootNode->lchild);

    PostorderOrderTraverse(pRootNode->rchild);

    printf("%d,",pRootNode->data);

}

调用如下

    PreOrderTraverse(rootTree); printf("\n");

        InOrderTraverse(rootTree); printf("\n");

        PostorderOrderTraverse(rootTree); printf("\n");

 log:

  70,30,10,20,60,40,50,

  10,30,20,70,40,60,50,

  10,20,30,40,50,60,70,

 

 

 

转载于:https://www.cnblogs.com/menchao/p/4834795.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值