数据结构之二叉树详解

数据结构之二叉树

        其实笔者对于二叉树也是刚开始学习,根本就不能完全了解其所有的知识信息,因此写这篇博客也是属于赶鸭子上架,不过既然如此,那就变学习边写吧。

至于有关树或者二叉树的一些基本概念知识在此就不一一解释了,主要就是通过程序来反应我们对二叉树的常用操作了。

前面我们学习了链表,其是一种线性结构,因此我们在创建或者遍历时能够轻易的抓住规律,但是对于二叉树,它是一种非线性的数据结构,因此我们对其访问也不能单单像链表那样了,其创建也是与之有一些差别。下面我们就通过程序来一步一步掌握二叉树的相关知识。

1.二叉树结点的定义

        我们知道二叉树一个结点最多只能有两个子节点,分别为左子节点和右子节点,因此其结点结构通常声明如下:

 typedef struct BINODE

{

     int data;

    struct BINODE *bleft,*bright;

}Binode;

2. 创建二叉树

        通过我学习一些博客程序来看,创建一个二叉树主要采用两种方式,一种是采用先序序列的方式来创建二叉树,另一种则是按二叉搜索树的方式来插入结点创建二叉树。在这里我就给出这两种程序的代码实现过程,并对其作出一些必要的解释。

(1)采用先序序列方式创建二叉树

void create_tree(Binode* &root)

{

    intdata;

         Binode *treenode;

 

         scanf("%d",&data);

         if(data== 0)

           {

              root = NULL;

           }

         else

           {

                     treenode = (Binode*)malloc(sizeof(Binode));

                     treenode->bleft = NULL;

                     treenode->bright= NULL;

                     root = treenode;

                     root->data = data;

 

                     create_tree(root->bleft);

                     create_tree(root->bright);

           }

}

        这个就是采用先序序列创建二叉树的函数代码,在这个函数中,我们采用data = 0来作为我们递归的结束条件,由于函数中有两个递归调用,因此要想整个输入结束,我们要多次在适当的时候输入0来结束输入,这个可能说的有点生硬,那就举个简单的例子,比方说我们要创建一个如下的二叉树:



则我们应该按照如下的输入方式

7  5 0  0  4 0  0

才能得到正确的链表。我们可以分析一下,当我们刚开始调用这个函数的时候,我们输入了7,然后执行了else的部分,接下来就又调用了create_tree(root->bleft)这个函数,然后又进行下一轮的输入了,但是请注意,此时跟这个create_tree(root->bleft)同级别的函数create_tree(root->bright)还没有开始执行。为了方便后面称呼,我把这个函数取名“二右”。当我们调用create_tree(root->bleft)后,在此输入一个5,然后又会递归调用,但是后面我们不会再输入了,因为5这个结点没有子节点了,因此我们要让这个递归结束,因此就要输入0,但是必须是两个0,因为有两个函数调用,这之后就跳到了我们的“二右”函数来执行了,然后在调用“二右”函数后,我们又要输入4,之后又要调用两个创建函数,但是由于4没有结点,因此要两次输入0来结束递归,这就是这个链表创建的过程,看起来感觉十分拗,如果结点多了就更加的难以理解,容易搞错了,不过,如果掌握了规律,其实也是好理解的,大家可以多看看体会一下。如果不喜欢这种方式,那么我们看看另外一种创建二叉树的方法。

(2) 按二叉搜索树方式来插入结点创建二叉树

void insert_create_tree(Binode* &root , int data)

{

    Binode *newnode;

   

         if(root== NULL)

           {

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值