• 二叉树详解-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,

     

     

     

  • 相关阅读:
    NFS与通配符
    yum管理RPM包与linux网络设置
    git常用命令总结——覆盖日常开发全操作
    inner join on会过滤掉两边空值的条件
    入园第一天
    P3750 [六省联考2017]分手是祝愿 题解
    CSP2021 爆零记
    CSP 前模板记录(黄题篇)
    对拍
    2021.10.20CSP模拟模拟赛 赛后总结
  • 原文地址:https://www.cnblogs.com/menchao/p/4834795.html
Copyright © 2020-2023  润新知