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,

     

     

     

  • 相关阅读:
    节点和坐标系
    精灵类
    导演类
    部分辅助宏
    妥善使用autorelease()方法
    内存管理笔记
    向eclipse中的项目导入jar包(作为library引用和放入web-inf/lib下的两种方法和区别)
    Request processing failed; nested exception is java.lang.NullPointerException
    getRequestURI、getReuqestURL的区别【转】
    tomcat部署javaWeb项目,界面样式都没有加载
  • 原文地址:https://www.cnblogs.com/menchao/p/4834795.html
Copyright © 2011-2022 走看看