zoukankan      html  css  js  c++  java
  • 二叉树详解-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(" ");

            InOrderTraverse(rootTree); printf(" ");

            PostorderOrderTraverse(rootTree); printf(" ");

     log:

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

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

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

     

     

     

  • 相关阅读:
    fn project 试用之后的几个问题的解答
    fn project 扩展
    fn project 生产环境使用
    fn project 对象模型
    fn project AWS Lambda 格式 functions
    fn project 打包Function
    fn project Function files 说明
    fn project hot functions 说明
    fn project k8s 集成
    fn project 私有镜像发布
  • 原文地址:https://www.cnblogs.com/menchao/p/4834795.html
Copyright © 2011-2022 走看看