【数据结构】二叉树的定义及二叉树的遍历,肯定是最详细的(附有源码-可直接运行)

目录

一,树的概念及定义

1.树的定义

2.树的相关专业术语

3.树的表示

二,.二叉树的概念

1.二叉树的定义

2.二叉树的性质

三,.二叉树的储存

1..顺序存储

2.链式存储

四,二叉树的操作

1.定义链式二叉树

2.初始化二叉树

3.添加结点到二叉树

4.获取二叉树的左右子树

5.二叉树的状态

6.二叉树的查找

7.二叉树的清空

五,二叉树的遍历

1.先序遍历

2.中序遍历

3.后序遍历

4.按层遍历

六,全部代码


一,树的概念

树:顾名思意,就是像树一样有无限的分支,但是这个的方向是向下长得。

它和线性链表的区别是:线性链表中具有:一个结点最多只有一个前驱和一个后继结点,其为线性的。但是树则遵循:一个结点有一个前驱和多个后继。

1.树的定义

树:具有n个结点的集合,集合中有一个称为根的特殊结点,在根结点下的分布着一些互不相交的集合,每个集合又是一个树,这些数称之为根结点的子树

感觉怎么样? 很抽象? 咱们上图说话。

 讲解3.1那么A就是根结点,如果连A也没有那么就是一个空集合(空树)也同时没有结点,同时A也是传说中的树根root,有关根结点在补充一点是:若在一棵树中,仅有一个结点,没有前驱,那么这个结点就是根结点。

2.树的相关专业术语

  • 父节点,子节点,兄弟结点:A是第一代,为父节点,B C D 为A的子节点,同时他仨还是兄弟,因此称之为兄弟结点.
  • 结点的度:就是计算结点的子数,看他们有几个孩子,比如A有三个孩子,A的度是3,B C D则分别是 1 2 2;
  • 树的度:就是整颗树中最大的度数,比如这个树就是 3
  • 叶结点和分支结点:度为0 的结点,就是他没有后代了,也叫做终端结点或叶结点,这里的有E J K L M N有孩子的叫分支结点或者非终端结点。
  • 结点的层数:从根结点开始计算(也就是A)然后往下数1 2  3 4
  • 树的深度:就是一棵树中结点的最大层数就是深度,这里是 4
  • 森林:把树根A干掉,B C D三个成为新的根了,多个树就是森林

3.树的表示

 你就将它按照括号里套括号来表示就行。

二,.二叉树额概念 

 任意的树可以转化为对应的二叉树,so,二叉树很重要。

1.二叉树的定义

二叉树:就是指一个树分成俩杈子,这就是二叉树。俩杈子左边叫左子树,右边叫右子树。

区别 :树的分支没有限制(也就是度),但是二叉树最多是俩,树的孩子多,不起名,二叉树做多就俩孩,有左右之分。

 一直俩孩,永不向偏叫:满二叉树,但凡只有一个孩子将付出全部的爱就叫:完全二叉树,但是完全二叉树可以用满二叉树来表示。完全二叉树的官方解释为:深度为k的,有n个结点的二叉树,当且仅当其每一个结点都与每一个结点都与深度为k的满二叉树中编号从1~n的结点一一对应时,称之为完全二叉树。特征:对任意结点,若其右分支的子孙最大层次为l,要求其左分支下的子孙的最大层次比为l或者 l +1,否则就不是完全二叉树 。                                                                       比如说:图a中的把N点去掉,他就不满足了总结:右分支可以少,左分支不可动

2.二叉树的性质

  • 二叉树中,第 i 层最多是2i-1个结点。
  • 深度为k的二叉树的结点 最少 k 个,最多 2k-1个结点 
  • 若一个二叉树,叶节点为 n0若度的为 2 的节点数为n2 那么则由 n0= n2+1(怎样解释呢,看那个满二叉树,也结点是8个,H~O,但是度为2的结点是A~G,所以差是1)

 对于(5)解释:这里的除法是满足整数除法的 3 / 2 = 1 

拿B举例,他的父结点是A也就是1 为 3/2=1,子为 D E,分别是4 5后边的同理

三,.二叉树的储存

1..顺序存储

解释:与线性表的顺序存储类似,二叉树也是将其存储到一个一维数组之中

定义如下

#define MAXSIZE 100    //最大结点数
typedef int DATA       //元素类型
typedef DATA SeqBinTree[MAXSIZE];
SeqBinTree SBT;   //定义保存二叉树组

 当你知道某一结点的位置时,你可以按照公式去推算他的父亲和左右的子结点的位置,

以E举例,现在结点是5,父结点就是(5 / 2)为 2 就是B,(前提存在)则其左子结点的话,就是5*2 = 10 计时J 右则为 5*2 +1 = 11 就是 K。

但是就这样储存就完了吗?

当然不是,若不是完全二叉树呢?中间有的没有子结点呢?或者子节点缺失呢?

不怕,按照完全二叉树来进行补齐,大不了算的是补的空,就是没有子结点呗


  2.链式存储

 声明:因为按照循序存储结构会浪费空间,在线性表也是同样的问题,那么多数用的都是链式存储结构

 看到这想到了什么,链表,双向链表,其实就是多了一个指针域,这个也同样

二叉链式结构

typedef struct ChainTree
{
    DATA data; //元素数据
    struct ChainTree *left; //左子树结点指针
    struct ChainTree *right;//右子树结点指针
 } ChainTreeType;
ChainTreeType *root=NULL; //定义二叉树根结点指针

最后一行的是根结点指针,若为空,则root为NULL。在具有n个结点的二叉树中,一共有2n个指针域,但是有n-1个指向孩子n+1个指针域为空(因为也结点是俩空指针,度为一的是一个空指针,所以2 * n0 + n1(空指针的总数量)因为遵循 n0 = n2 + 1,所以则总和一下 空指针 = n0 +(n2 + 1)+ n1 得到为 n + 1个空)上边的性质三(标红)

三叉链式结构

typedef struct ChainTree
{
    DATA data; //元素数据
    struct ChainTree *left; //左子树结点指针
    struct ChainTree *right;//右子树结点指针
    struct ChainTree *parent;//父结点指针
 } ChainTreeType;
ChainTreeType *root=NULL; //定义二叉树根结点指针

四,二叉树的操作

1.定义链式二叉树

  

#include <stdio.h>
#include <stdlib.h>
#define QUEUE_MAXSIZE 50 //队列的大小
typedef char DATA;  //类型
typedef struct ChainTree //二叉树结点类型
{
	DATA data;     //数据储存
	struct ChainTree* left; //左
	struct ChainTree* right;
}ChainBinTree;

2.初始化二叉树

:参数node为二叉树的指针,当其不为空,则作为根结点

ChainBinTree* BinTreeInit(ChainBinTree* node)
{
    if (node != NULL) //节点不为空
        return node;
    else
    return NULL;
}

3.添加结点到二叉树

bt是父结点的指针,node是子结点,n则判断将node添加的左或右结点

int BinTreeAddNode(ChainBinTree* bt, ChainBinTree* node, int n)
{
    if (bt == NULL)
    {
        printf("父节点不存在,请先设置父节点!\n");
        return 0;
    }
    switch (n)
    {
    case 1: if (bt->left) {
        printf("左子树结点不为空!\n");
        return 0;
    }else
        bt->left = node;
        break;
    case 2:  if (bt->right) {
        printf("右子树结点不为空!\n");
        return 0;
    }else
        bt->right = node;
        break;
    default:
        printf("参数错误!\n");
        return 0;
    }
    return 1;
}

4.获取二叉树的左右子树

ChainBinTree* BinTreeLeft(ChainBinTree* bt) //返回左子结点
{
    if (bt)
        return bt->left;
    else
        return NULL;
}

ChainBinTree* BinTreeRight(ChainBinTree* bt)
{
    if (bt)
        return bt->right;
    else
        return NULL;
}

5.二叉树的状态

二叉树的深度计算方式

int BinTreeIsEmpty(ChainBinTree* bt) //检查是否为空
{
    if (bt)
        return 0;
    else
        return 1;
}

int BinTreeDepth(ChainBinTree* bt) //得到深度
{
    int dep1, dep2;
    if(bt==NULL)
        return 0;
    else
    {
        dep1 = BinTreeDepth(bt->left);
        dep2 = BinTreeDepth(bt->right);
        if (dep1 > dep2)
            return dep1 + 1;
        else
            return dep2 + 1;
    }
}

6.二叉树的查找

ChainBinTree* BinTreeFind(ChainBinTree* bt, DATA data)
{
    ChainBinTree* p;
    if(bt==NULL)
      return NULL;
    else
    {
        if (bt->data == data)
            return bt;
        else {
            if (p = BinTreeFind(bt->left, data))
                return p;
            else if (p = BinTreeFind(bt->left, data))
                return p;
            else
                return NULL;
        }
    }
}

7.二叉树的清空

因为是malloc所申请的内存,因此要用free函数来释放所占内存。

void BinTreeClear(ChainBinTree* bt)
{
    if (bt)
    {
        BinTreeClear(bt->left);
        BinTreeClear(bt->right); //清空左右结点
        free(bt); //释放当前结点
        bt = NULL;
    }
    return;
}

五,二叉树的遍历

 

1.先序遍历

则遵循以下的code原则

void BinTree_DLR(ChainBinTree* bt, void(*poer)(ChainBinTree* p))
{
    if (bt)
    {
        oper(bt); 
        BinTree_DLR(bt->left, oper);
        BinTree_DLR(bt->right, oper);
    }
    return;
}

2.中序遍历


void BinTree_LDR(ChainBinTree* bt, void(*poer)(ChainBinTree* p))
{
    if (bt)       //树不为空
    {
        
        BinTree_LDR(bt->left, oper);//中序遍历
        oper(bt);
        BinTree_LDR(bt->right, oper);
    }
    return;
}

3.后序遍历

void BinTree_LRD(ChainBinTree* bt, void(*poer)(ChainBinTree* p))
{
    if (bt)       //树不为空
    {

        BinTree_LDR(bt->left, oper);//中序遍历
        BinTree_LDR(bt->right, oper);
        oper(bt);
    }
    return;
}

4.按层遍历

void BinTree_level(ChainBinTree* bt, void(*poer)(ChainBinTree* p))
{
    ChainBinTree* p;
    ChainBinTree* q[QUEUE_MAXSIZE];
    int head = 0, tail = 0;
    if (bt)
    {
        tail = (tail + 1) % QUEUE_MAXSIZE; //上一节的那一套
        q[tail] = bt;
    }
    while (head != tail)
    {
        head = (head + 1) % QUEUE_MAXSIZE;
        p = q[head];
        oper(p);
        if (p->left != NULL)
        {
            tail = (tail + 1) % QUEUE_MAXSIZE;
            q[tail] = p->left;
        }
        if (p->right != NULL)
        {
            tail = (tail + 1) % QUEUE_MAXSIZE;
            q[tail] = p->right;
        }
    }
    return;
}

六,全部代码

BinTree函数部分

#include "Bintree.h"

void oper(ChainBinTree* p)
{
    printf("%c ", p->data);
    return;
}

ChainBinTree* BinTreeInit(ChainBinTree* node)
{
    if (node != NULL) //节点不为空
        return node;
    else
    return NULL;
}

int BinTreeAddNode(ChainBinTree* bt, ChainBinTree* node, int n)
{
    if (bt == NULL)
    {
        printf("父节点不存在,请先设置父节点!\n");
        return 0;
    }
    switch (n)
    {
    case 1: if (bt->left) {
        printf("左子树结点不为空!\n");
        return 0;
    }else
        bt->left = node;
        break;
    case 2:  if (bt->right) {
        printf("右子树结点不为空!\n");
        return 0;
    }else
        bt->right = node;
        break;
    default:
        printf("参数错误!\n");
        return 0;
    }
    return 1;
}

ChainBinTree* BinTreeLeft(ChainBinTree* bt)
{
    if (bt)
        return bt->left;
    else
        return NULL;
}

ChainBinTree* BinTreeRight(ChainBinTree* bt)
{
    if (bt)
        return bt->right;
    else
        return NULL;
}

int BinTreeIsEmpty(ChainBinTree* bt)
{
    if (bt)
        return 0;
    else
        return 1;
}

int BinTreeDepth(ChainBinTree* bt)
{
    int dep1, dep2;
    if(bt==NULL)
        return 0;
    else
    {
        dep1 = BinTreeDepth(bt->left);
        dep2 = BinTreeDepth(bt->right);
        if (dep1 > dep2)
            return dep1 + 1;
        else
            return dep2 + 1;
    }
}

ChainBinTree* BinTreeFind(ChainBinTree* bt, DATA data)
{
    ChainBinTree* p;
    if(bt==NULL)
      return NULL;
    else
    {
        if (bt->data == data)
            return bt;
        else {
            if (p = BinTreeFind(bt->left, data))
                return p;
            else if (p = BinTreeFind(bt->left, data))
                return p;
            else
                return NULL;
        }
    }
}

void BinTreeClear(ChainBinTree* bt)
{
    if (bt)
    {
        BinTreeClear(bt->left);
        BinTreeClear(bt->right); //清空左右结点
        free(bt); //释放当前结点
        bt = NULL;
    }
    return;
}

void BinTree_DLR(ChainBinTree* bt, void(*poer)(ChainBinTree* p))
{
    if (bt)
    {
        oper(bt); 
        BinTree_DLR(bt->left, oper);
        BinTree_DLR(bt->right, oper);
    }
    return;
}

void BinTree_LDR(ChainBinTree* bt, void(*poer)(ChainBinTree* p))
{
    if (bt)       //树不为空
    {
        
        BinTree_LDR(bt->left, oper);//中序遍历
        oper(bt);
        BinTree_LDR(bt->right, oper);
    }
    return;
}

void BinTree_LRD(ChainBinTree* bt, void(*poer)(ChainBinTree* p))
{
    if (bt)       //树不为空
    {

        BinTree_LDR(bt->left, oper);//中序遍历
        BinTree_LDR(bt->right, oper);
        oper(bt);
    }
    return;
}

void BinTree_level(ChainBinTree* bt, void(*poer)(ChainBinTree* p))
{
    ChainBinTree* p;
    ChainBinTree* q[QUEUE_MAXSIZE];
    int head = 0, tail = 0;
    if (bt)
    {
        tail = (tail + 1) % QUEUE_MAXSIZE; //上一节的那一套
        q[tail] = bt;
    }
    while (head != tail)
    {
        head = (head + 1) % QUEUE_MAXSIZE;
        p = q[head];
        oper(p);
        if (p->left != NULL)
        {
            tail = (tail + 1) % QUEUE_MAXSIZE;
            q[tail] = p->left;
        }
        if (p->right != NULL)
        {
            tail = (tail + 1) % QUEUE_MAXSIZE;
            q[tail] = p->right;
        }
    }
    return;
}

BinTree.h

#include <stdio.h>
#include <stdlib.h>
#define QUEUE_MAXSIZE 50
typedef char DATA;
typedef struct ChainTree
{
	DATA data;
	struct ChainTree* left;
	struct ChainTree* right;
}ChainBinTree;
void oper(ChainBinTree* p);
ChainBinTree* BinTreeInit(ChainBinTree* node); //初始化
int BinTreeAddNode(ChainBinTree* bt, ChainBinTree* node, int n); //添加到二叉树
ChainBinTree* BinTreeLeft(ChainBinTree* bt); //返回左子节点
ChainBinTree* BinTreeRight(ChainBinTree* bt); //返回左子节点
int BinTreeIsEmpty(ChainBinTree* bt); //检验是否为空
int BinTreeDepth(ChainBinTree* bt); //求深度
ChainBinTree* BinTreeFind(ChainBinTree* bt, DATA data);
void BinTreeClear(ChainBinTree* bt);
//void BinTree_DLR(BinTree);
void BinTree_DLR(ChainBinTree* bt, void(*poer)(ChainBinTree* p));
void BinTree_LDR(ChainBinTree* bt, void(*poer)(ChainBinTree* p));
void BinTree_LRD(ChainBinTree* bt, void(*poer)(ChainBinTree* p));
void BinTree_level(ChainBinTree* bt, void(*poer)(ChainBinTree* p));

BinTree.c(main函数部分)

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

ChainBinTree* InitRoot()
{
	ChainBinTree* node;
	
	if (node = (ChainBinTree*)malloc(sizeof(ChainBinTree)))
	{
		printf("\n输入根节点数据:");
		scanf("%s", &node->data);
		node->left = NULL;
		node->right = NULL;
		return node;	
	}
	return NULL;
}
void AddNode(ChainBinTree* bt)
{
	ChainBinTree* node, * parent;
	DATA data;
	char select;
	if (node = (ChainBinTree*)malloc(sizeof(ChainBinTree)))
	{
		printf("\n输入二叉树的结点数据:");
		fflush(stdin);
		scanf("%s", &node->data);
		node->left = NULL;
		node->right = NULL;
		printf("输入父结点数据:");
		fflush(stdin);
		scanf("%s", &data);
		parent = BinTreeFind(bt, data);
		if (!parent)
		{
			printf("未找到父结点!\n");
			free(node);
			return;
		}
		printf("1.添加到左子树\n 2.添加到右子树\n");
		do {
			select = getchar();
			select -= '0';
			if (select == '1' || select == '2')
				BinTreeAddNode(parent, node, select);
		} while (select != 1 && select != 2);
	}
	return;
}
int main()
{
	ChainBinTree* root = NULL;
	char select;
	void (*oper1)(ChainTree*); //指向集体的指针
	oper1 = &oper;  //指向具体的操作函数
	do {
		printf("\n1.设置二叉树根元素  2.添加二叉树结点\n");
		printf("3.先序遍历           4.中序遍历\n");
		printf("5.后序遍历           6.按层遍历\n");
		printf("7.二叉树的深度        0.退出\n");
		select = getchar();
		switch (select) {
		case '1': root = InitRoot(); break;
		case '2':AddNode(root); break;
		case '3': 
			printf("\n先遍历的结果:");
			BinTree_DLR(root,oper1);
			printf("\n");
			break;
		case '4':
			printf("\n中序遍历的结果:");
			BinTree_LDR(root, oper1);
			printf("\n");
			break;
		case '5':
			printf("\n中序遍历的结果:");
			BinTree_LRD(root, oper1);
			printf("\n");
			break;
		case '6':
			printf("\n中序遍历的结果:");
			BinTree_level(root, oper1);
			printf("\n");
			break;
		case '7': printf("\n二叉树的深度为:%d\n", BinTreeDepth(root)); break;
		case '0': break;
		}
	} while (select != '0');
	BinTreeClear(root);
	root = NULL;
	getchar();
	return 0;

}

运行

 那个做着做着太累喽,后边就在凑合了,下次要注意我的篇幅和详细和略过的点,我会注意的,我能力有限,只能写道这个部分,谢谢阅读。

i-阿松!
关注 关注
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
叉树代码实现详解
jiletianzun的博客
06-03 950
#include <iostream> using namespace std; /* 树节点结构体 */ typedef struct _node { int t; //数据类型,可以改,也可以用模板类型 _node* left_node; //左节点 _node* right_node; //右节点 _node(int tt,_node* left_node_new,_node*right_node_new):t(tt),left_node(lef...
数据结构实验报告6--叉树的遍算法-实验内容及要求.docx
07-06
编写程序,用先序递归遍法建立二叉树的二叉链表存储结构,然后输出其先序、中序、后序以及层次遍结点访问次序。其中层次遍的实现需使用循环队列。二叉树结点数据类型建议选用字符类型
C语言写二叉树
jakelihua
11-28 1508
简介:本文是博主当初学习阶段,用C语言实现的二叉树代码。
数据结构-叉树的代码实现(详解)
weixin_73142957的博客
07-11 3250
内容:二叉树的前、中,后序遍,层序遍,二叉树节点个数,叶子节点个数,二叉树高度,第k层节点的个数,查找某个节点,二叉树销毁,判断是否为完全二叉树
【树】二叉树的遍及递归遍算法
weixin_45765128的博客
03-25 1914
叉树定义叉树的遍:按一定规律对二叉树中的每个结点进行访问且仅访问一次。其中的访问可指计算二叉树中结点的数据信息,打印该结点的信息,也包括对结点进行任何其他操作。 为什么需要遍叉树? 二叉树是非线性数据结构,通过遍可以将二叉树中的结点访问一次且仅一次,从而得到访问结点的顺序序列。从这个意义上说,遍操作就是将二叉树中结点按一定规律线性化的操作,目的在于将非线性化结构变成线性化...
叉树及其遍方式+代码
weixin_50901244的博客
02-22 3493
叉树及其遍方式1、树型结构及基本概念1.1 树型结构概念1.2 一些重要概念2. 二叉树及基本概念2.1 二叉树概念2.2 两种特殊的二叉树2.3 二叉树的性质2.4 二叉树的存储2.5 二叉树的基本操作2.5.1 二叉树的遍2.5.2 代码 1、树型结构及基本概念 1.1 树型结构概念 树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。 树型结构的特点 子树不相交 除根节点外,每个节点有
数据结构-叉树的建立及遍操作
05-23
数据结构-叉树的建立及遍操作
数据结构课程设计报告-叉树的遍.docx
03-07
数据结构课程设计报告-叉树的遍 本报告基于二叉树的遍方法,旨在通过递归和非递归两种方法创建一棵二叉树,并对其进行先序遍、中序遍、后序遍及层次遍,并求出该二叉树的深度和叶子结点数。同时,...
C语言数据结构之二叉树的非递归后序遍算法
08-29
主要介绍了C语言数据结构之二叉树的非递归后序遍算法的相关资料,希望通过本文能帮助到大家,让大家实现这样的功能,需要的朋友可以参考下
数据结构-叉树(详细过程).docx
10-24
叉树的遍
叉树C语言基本定义+操作代码+注释详解(二叉树的递归/非递归遍方法)
Ms.Lyq的博客
07-01 2751
叉树C语言基本定义+操作代码+注释详解1.树的基本特点1.1.儿子兄弟表示法2.二叉树定义性质即储存2.1.二叉树的基本性质2.2.数组表示方法2.3.链表的表示方法3.二叉树的遍3.1.先序遍3.2.中序遍中序遍非递归算法3.2.后序遍 1.树的基本特点 子树不相交 j结点的度:结点的子树个数 叶节点:度为0的结点 除根节点,每个结点有且仅有一个父结点 一颗N个结点的树有N-1条边 查找成功时查找次数不会超过判定树的深度(n个结点的判定树深度为 结点的层次:规定根结
数据结构之二叉树基本概念
lspdd的博客
02-13 1864
叉树的基本概念 二叉树(Binary tree)是树形结构的一个重要类型。许多实际问题抽象出来的数据结构往往是二叉树形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。二叉树特点是每个结点最多只能有两棵子树,且有左右之分 来自百度词条 二叉树的基本形态: 1.空的二叉树: 其实就是指向空的指针 2.只有根节点的二叉树: 也就是一个指针指向一个节点,这个节点是根节点 3.只有左子树和右子树: 只有左子树和右子树(又称斜树,其实也就成了链表):如下图:
数据结构叉树的建立与遍
weixin_34357928的博客
05-03 2991
叉树(Binary Tree)是n(n >= 0)个节点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根节点和两颗互不相交的,分别称为根节点的左子树和右子树的二叉树组成。二叉嘛,也就是每个节点最多有两个分支。图示:二叉树具有五种基本形态:1.空二叉树2.只有一个根节点3.根节点只有左子树4.根节点只有右子树5.根节点既有左子树又有右子树特殊的二叉...
数据结构----叉树应用
不停
05-26 228
例子: 输出二叉树中的叶子结点 、增加一个输出判定; if (BT) { if(!BT->Left&& !BT->Right) printf(:%d",BT->data); ---- 例子: 求二叉树的高度。 int PostOrderGetHeight(BinTree BT) { int HL,BR,MaxH; if(BT) { HL=Pos...
数据结构基础整理】树--04:图解-树的中序遍
ATFWUS的博客
02-12 964
图解树的中序遍递归执行过程 本章建立在以下章节的基础上: C数据结构与算法-基础整理--02:二叉树的建立及四种遍方式 C数据结构与算法-基础整理--03:图解-通过前序遍对递归执行原理的深入理解 中序遍函数递归执行过程图解 代码如下: //中序遍,递归实现 void InorderTraversal(BinTree BT) { if (BT == NULL)...
数据结构之二叉树(概念)
每天进步一点点。。。的博客
07-19 1871
树的定义: 树是n个结点的有限集。 n = 0 称为空树。如果n>0,则: (1)有一个特定的称之为根的结点,它只有直接后继,但没有直接前驱。 (2)除根以外的其他结点划分为m个互不相交的有限集合,每个集合又是一棵树,并且称之为根的子树。每棵子树的根节点有且仅有一个直接前驱,但可以有0个或多个直接后继。   与树相关的定义: 节点:表示树中的元素,包括数据元素的内容及其指向其子树的分支
叉树定义和性质
South.return
10-22 3344
目录 二叉树定义叉树的性质 性质1 在二叉树的第i层上至多有 2^(i-1)个结点。(i≥1) 性质2深度为k的二叉树至多有2^(k)-1个结点。(k≥1) 性质3对任何一棵二叉树T,若其终端结点数为n0,度数为2的结点数为n2,则n0=n2+1。 性质4具有n个结点的完全二叉树的深度为[log n]+1 或 log(n+1)。 二叉树定义 概述:所有结点的度都只为0、1、2的树,就是二叉树定义:二叉树 (Binary Tree)是 n(n≥0)个结点的...
数据结构6:二叉树的代码实现
GD_ONE的博客
06-03 367
以二叉链表存储二叉树,以 ‘#‘ 表示无后继结点。 #include<stdio.h> #include<iostream> #include<string.h> #include<string> #include<algorithm> #include<stack> #include<queue> usin...
叉树的遍及其用途
凉风有信
08-16 8939
最近在看《大话数据结构》这本书,看到了很早以前学习的前中后遍,想到了面试的时候被问到了这三种遍的用途,特地整理一下。首先就要先说前中后遍 这个东西网上百度一大堆,而且都很简单,其实就是一个口诀。 根左右(前) 左根右(中) 左右根(后) 有没有发现其实就是‘根’的位置发生了改变,前就是‘根’在前,中在中,后在后。 按照这个口诀遍下来就是所谓的前中后遍。 下
叉树实现代码c语言
最新发布
11-25
叉树是一种非常常用的数据结构,它的实现代码在C语言中也是比较简单的。下面我用300字中文回答怎样在C语言中实现二叉树的代码。 首先,我们需要定义叉树的结构体。一个二叉树的结点包含一个数据域和两个指针域,分别指向左子树和右子树。然后,我们可以定义一些基本的操作函数,比如创建二叉树、插入结点、删除结点等。在创建二叉树的函数中,我们可以使用递归的方法来逐个插入结点,这样可以保证二叉树的平衡性。在插入和删除结点的函数中,我们需要考虑一些特殊情况,比如插入重复结点、删除叶子结点或者有两个子结点的结点等。此外,我们还可以定义一些遍叉树的函数,比如前序遍、中序遍和后序遍等,这样可以帮助我们更好地理解二叉树的结构和数据。 总的来说,实现二叉树的代码在C语言中并不困难,只要我们熟悉二叉树的基本概念和操作方式,就可以轻松地完成这个任务。当然,为了提高代码的可读性和可维护性,我们还可以使用一些封装技术,比如将二叉树的结构体和操作函数放在一个头文件中,这样可以方便其他程序在需要的时候直接引用。希望这些内容能帮助你更好地理解如何在C语言中实现二叉树的代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • PTA—判断素数 7469
  • 字符串的大小写转换(多种方式) 6506
  • 离散数学---判断矩阵:自反性,反自反性,对称性得到矩阵的自反闭包,对称闭包。 6031
  • 使用爬虫去获取四六级成绩 4418
  • 数据结构-栈的运用-数的进制转换 4375

分类专栏

  • 微信小程序 1篇
  • js 1篇
  • C++ 3篇
  • java 1篇
  • mySQL 3篇

最新评论

  • 使用爬虫去获取四六级成绩

    i-阿松!: 哈哈哈,谢谢

  • 使用爬虫去获取四六级成绩

    白话机器学习: 文章写得专业、深入、详细,收藏啦

  • 微信小程序-词汇大师项目分享

    i-阿松!: 这个文章是展示了部分的页面展示,【微信小程序制作-背单词的小程序制作 - CSDN App】http://t.csdnimg.cn/WPvrB

  • 微信小程序制作-背单词的小程序制作

    i-阿松!: 我已经将这个项目开源了,这个里边有演示视频的链接【微信小程序-词汇大师项目分享 - CSDN App】http://t.csdnimg.cn/ZQS6l

  • 微信小程序制作-背单词的小程序制作

    2202_75352922: 好好好好哈哈哈

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • 使用爬虫去获取四六级成绩
  • 微信小程序-词汇大师项目分享
  • 微信小程序制作-背单词的小程序制作
2024年2篇
2023年14篇
2022年45篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

i-阿松!

请给我一毛钱

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值

聚圣源adjust郑氏起名的女孩名字大全大全穿越火影小说海绵宝宝吧cctv在线gelbooru孩子姓田起名园林园林公司起名大全集法国中尉的女人姓马的小朋友起名武汉大学文学院锦取名起名大全下雨天了怎么办我好想你柴字起名银证转账手续费小孩小名怎么起response.end武则天刘晓庆版姓赛起名字rtv起名用若字给女孩起名175yo浪漫满屋国语版全集安卓读书最终幻想10下载男孩五行缺金缺木起名大全儿童起名幻想曹操传攻略遥望行止电影公社淀粉肠小王子日销售额涨超10倍罗斯否认插足凯特王妃婚姻让美丽中国“从细节出发”清明节放假3天调休1天男孩疑遭霸凌 家长讨说法被踢出群国产伟哥去年销售近13亿网友建议重庆地铁不准乘客携带菜筐雅江山火三名扑火人员牺牲系谣言代拍被何赛飞拿着魔杖追着打月嫂回应掌掴婴儿是在赶虫子山西高速一大巴发生事故 已致13死高中生被打伤下体休学 邯郸通报李梦为奥运任务婉拒WNBA邀请19岁小伙救下5人后溺亡 多方发声王树国3次鞠躬告别西交大师生单亲妈妈陷入热恋 14岁儿子报警315晚会后胖东来又人满为患了倪萍分享减重40斤方法王楚钦登顶三项第一今日春分两大学生合买彩票中奖一人不认账张家界的山上“长”满了韩国人?周杰伦一审败诉网易房客欠租失踪 房东直发愁男子持台球杆殴打2名女店员被抓男子被猫抓伤后确诊“猫抓病”“重生之我在北大当嫡校长”槽头肉企业被曝光前生意红火男孩8年未见母亲被告知被遗忘恒大被罚41.75亿到底怎么缴网友洛杉矶偶遇贾玲杨倩无缘巴黎奥运张立群任西安交通大学校长黑马情侣提车了西双版纳热带植物园回应蜉蝣大爆发妈妈回应孩子在校撞护栏坠楼考生莫言也上北大硕士复试名单了韩国首次吊销离岗医生执照奥巴马现身唐宁街 黑色着装引猜测沈阳一轿车冲入人行道致3死2伤阿根廷将发行1万与2万面值的纸币外国人感慨凌晨的中国很安全男子被流浪猫绊倒 投喂者赔24万手机成瘾是影响睡眠质量重要因素春分“立蛋”成功率更高?胖东来员工每周单休无小长假“开封王婆”爆火:促成四五十对专家建议不必谈骨泥色变浙江一高校内汽车冲撞行人 多人受伤许家印被限制高消费

聚圣源 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化