数据结构学习---二叉树简单实现

想必二叉树大家都很熟悉。结点有左右孩子,二叉树非常使用,编写二叉树和链表差不多,多多运用迭代就能很好的解决问题,但是这仅仅限于在量比较小的情况下,非递归的代码执行效率大家有目共睹。

#ifndef _TREENODE_H_
#define _TREENODE_H_
typedef int Elemtype;
typedef struct treeNode{
    Elemtype tRoot;
    struct treeNode * pLight;
    struct treeNode * pRight;
}treeNode;
#endif

定义结构体还是差不多的。

#include<stdio.h>
#include"treeNode.h"

void show(treeNode * pNode)
{
    if(NULL == pNode)
        return;
    printf("%d - ",pNode->tRoot);
    show(pNode->pLight);
    show(pNode->pRight);
}

  先根,中根,后根就是把printf放到不同的位置。

/*************************************************************************
	> File Name: InitHead.c
	> Author: aaron
	> Mail: [email protected]
	> Created Time: Fri 17 Mar 2017 04:33:21 PM CST
 ************************************************************************/

#include<stdio.h>
#include"treeNode.h"
#include<string.h>
#include<stdlib.h>

treeNode * InitHead(Elemtype data)
{
    treeNode * pNode = (treeNode *)malloc(sizeof(treeNode));
    if (NULL != pNode)
    {
        pNode->tRoot = data;
        pNode->pLight = NULL;
        pNode->pRight = NULL;
    }
    return pNode;
}

  初始化头结点。最好的写在一起的还有带销毁的。

/*************************************************************************
	> File Name: createTree.c
	> Author: aaron
	> Mail: [email protected]
	> Created Time: Fri 17 Mar 2017 03:05:37 PM CST
 ************************************************************************/

#include<stdio.h>
#include"treeNode.h"
#include<stdlib.h>
#include"Fun.h"
treeNode * recursion(treeNode * pNode,Elemtype * INdata)
{
    if (NULL == pNode)
    {
        treeNode * qtmp = InitHead(*INdata);
        return qtmp;
    }
    else if (*INdata > pNode->tRoot)
    {
        pNode->pLight = recursion(pNode->pLight,INdata);
        return pNode;                          //起先这里没加
    }
    else
    {
        pNode->pRight = recursion(pNode->pRight,INdata);
        return pNode;                           //这里同样
    }
}

treeNode * createTree(treeNode * pNode,Elemtype * INdata)
{
   if (NULL == pNode
    ||NULL == INdata)
    {
        return pNode;
    }
    recursion(pNode,INdata);
    return pNode;
}

  (二叉排序树)这里我碰到了一个我自己看了好久的问题。上面有地方没加return 只有一个函数出口,导致递归的时候超过三个结点插入的时候,只能插在不超过三个三层的位置。后来我看了一下,递归了好几层都只有在第一层这个出口这里,所以解决问题的方法是在每次调用递归函数的时候加出口。

-----------------后补上非递归二叉排序树。2017-03-1911:42:19

时间: 2024-10-10 15:17:35

数据结构学习---二叉树简单实现的相关文章

数据结构学习之第7章 树和二叉树

数据结构学习之第7章 树和二叉树 0x7.1.1 树的基本概念 ?1.树的定义 ? 树是由n(n>=0)个结点(或元素)组成的有限集合(记为T) ? 如果n>0,这n个结点中有且仅有一个结点作为树的根结点,简称为根,其余结点可分为m(m>=0)个互不相交的有限集\[T_{1}T_{2}\cdots T_{m}\],其中每个子集又是一棵符合定义的子树,称为根结点的子树. 知识点:由树的定义我们可以看出来树的结构是递归的 ?2.树的逻辑表示法 ? 1.树形表示法 ? 2.文氏图表示法 ? 3

文章分享:简单数据结构学习:单向链表

文章分享:简单数据结构学习:单向链表:https://www.textarea.com/aprikyb/jiandan-shujujiegou-xuexi-danxiang-lianbiao-252/

数据结构学习1:实现一个简单的线性表功能

数据结构: 一个简单的线性表的实现 学习了数据结构有一段时间了,那是半年前老师课堂上讲的,最后由于一些原因,没能听到最后,前几天在写一些算法的时候,发现自己的数据结构还是太渣了,因此便又拿起了那本很有价值的数据结构的书,重新来啃这本厚厚的书,数据结构在我们编程中是非常的重要的,希望这次的学习能有一个好的开头,并且能在这个过程中有所得吧! 下面是我写的一个简单的线性表的实现: #include"stdafx.h" #include<iostream> using namesp

数据结构学习日记2:实现一个简单的线性表功能(链式存储方式)

数据结构学习日记,此次是用链表来实现一个线性表的功能 // ListTable1.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> using namespace std; #define ERROR 0; #define OK 1; typedef int Status; typedef int ElemType; //声明一个节点 typedef struct Node { ElemType d

数据结构——树的简单操作集合

非常多数据结构的书上解说数据机构时都是採用伪代码实现.事实上感觉蛮不直观的.所以对于全部的数据结构操作我都将其用C实现一遍. 树是学习二叉树的基础,也是后面理解B树.B+树的等树的基础,以下就给出树的几个简单操作,方便理解. 数据结构 //-------数据结构---------------------------------------- #define m 3 //定义度为3的树 typedef char datatype; typedef struct node { datatype da

数据结构学习——堆

1 基本介绍 堆数据结构是一种数组对象,它可以被视为一颗完全二叉树.堆的访问可以通过三个函数来进行即, parent(i) return floor(i/2); left(i) return 2i; right(i) return 2i + 1; left操作可以通过一步左移操作完成,right操作可以通过左移并在地位+1实现,parent操作则可以通过把i右移一位得到.在实现中通常会使用宏或者内联函数来实现这三个操作. 二叉堆有两种,最大堆和最小堆.对于最大堆有 A[i] >= A[left(

小猪的数据结构学习笔记(四)

小猪的数据结构学习笔记(四) 线性表之静态链表 --转载请注明出处:coder-pig 本章引言: 在二,三中中我们分别学习了顺序表中的线性表与单链表,线性表有点类似于 我们前面所学的数组,而单链表使用的最多的是指针,这里问个简单的问题, 如果是在以前没有指针的话,前辈先人们怎么实现单链表呢?大家思考下! 没有指针,那么用什么来代替呢?前辈先人们非常机智,想出了使用下标+游标的方式 来实现单链表的效果!也就是今天要讲的--静态链表! 当然你也可以直接跳过本章,因为有了单链表就没有必要用静态链表了

小猪的数据结构学习笔记(二)

小猪的数据结构学习笔记(二) 线性表中的顺序表 本节引言: 在上个章节中,我们对数据结构与算法的相关概念进行了了解,知道数据结构的 逻辑结构与物理结构的区别,算法的特性以及设计要求;还学了如何去衡量一个算法 的好坏,以及时间复杂度的计算!在本节中我们将接触第一个数据结构--线性表; 而线性表有两种表现形式,分别是顺序表和链表;学好这一章很重要,是学习后面的基石; 这一节我们会重点学习下顺序表,在这里给大家一个忠告,学编程切忌眼高手低,看懂不代表自己 写得出来,给出的实现代码,自己要理解思路,自己

数据结构学习之二叉排序树

介绍:二叉排序树是以一定的规则排列树中元素,因而可以进行快速的排序和查询的树状数据结构,一般规则是:对于树中任意一个节点,左孩子严格小于根,根严格小于右孩子,有点像大根堆.(只是大根堆中左右孩子关系并不确定,且和根的关系是统一的,而且有上浮和下沉操作使得大根堆总是一棵完全二叉树,其不断弹出堆顶形成有序列的过程叫做堆排序.虽然二叉排序树中也有旋转操作使得树尽量平衡,但是由于数值大小分明的左右孩子,在进行平衡操作时远不如大根堆方便快捷.)对于一棵已经构造完成的排序二叉树,它的中序遍历序列即为升序排列