广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言中二叉树的常见操作是什么
  • 833
分享到

C语言中二叉树的常见操作是什么

2023-06-08 08:06:12 833人浏览 薄情痞子
摘要

这篇文章主要讲解了“C语言中二叉树的常见操作是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C语言中二叉树的常见操作是什么”吧!一、基本概念每个结点最多有两棵子树,左子树和右子树,次序不

这篇文章主要讲解了“C语言二叉树的常见操作是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C语言中二叉树的常见操作是什么”吧!

一、基本概念

每个结点最多有两棵子树,左子树和右子树,次序不可以颠倒。

性质:

1、非空二叉树的第n层上至多有2^(n-1)个元素。

2、深度为h的二叉树至多有2^h-1个结点。

满二叉树:所有终端都在同一层次,且非终端结点的度数为2。

在满二叉树中若其深度为h,则其所包含的结点数必为2^h-1。

完全二叉树:除了最大的层次即成为一颗满二叉树且层次最大那层所有的结点均向左靠齐,即集中在左面的位置上,不能有空位置。

对于完全二叉树,设一个结点为i则其父节点为i/2,2i为左子节点,2i+1为右子节点。

二、存储结构

顺序存储:

数据结构存在一块固定的数组中。

#define LENGTH 100typedef char datatype;typedef struct node{  datatype data;  int lchild,rchild;  int parent;}Node;Node tree[LENGTH];int length;int root;

虽然在遍历速度上有一定的优势,但因所占空间比较大,是非主流二叉树。二叉树通常以链式存储。

链式存储:

typedef char datatype;typedef struct BinNode{  datatype data;  struct BinNode* lchild;  struct BinNode* rchild;}BinNode;typedef BinNode* bintree;     //bintree本身是个指向结点的指针

三、二叉树的遍历

遍历即将树的所有结点访问且仅访问一次。按照根节点位置的不同分为前序遍历,中序遍历,后序遍历。

前序遍历:根节点->左子树->右子树

中序遍历:左子树->根节点->右子树

后序遍历:左子树->右子树->根节点

例如:求下面树的三种遍历

C语言中二叉树的常见操作是什么

前序遍历:abdefGC

中序遍历:debgfac

后序遍历:edgfbca

四、遍历的实现

递归实现(以前序遍历为例,其他的只是输出的位置稍有不同)

void preorder(bintree t){  if(t){    printf("%c ",t->data);    preorder(t->lchild);    preorder(t->rchild);  }}

非递归的实现

因为当遍历过根节点之后还要回来,所以必须将其存起来。考虑到后进先出的特点,选用栈存储。数量确定,以顺序栈存储。

#define SIZE 100typedef struct seqstack{  bintree data[SIZE];  int tag[SIZE];  //为后续遍历准备的  int top;   //top为数组的下标}seqstack;void push(seqstack *s,bintree t){  if(s->top == SIZE){    printf("the stack is full\n");  }else{    s->top++;    s->data[s->top]=t;  }}bintree pop(seqstack *s){  if(s->top == -1){    return NULL;  }else{    s->top--;    return s->data[s->top+1];  }}

1、前序遍历

void preorder_dev(bintree t){  seqstack s;  s.top = -1;   //因为top在这里表示了数组中的位置,所以空为-1  if(!t){    printf("the tree is empty\n");  }else{    while(t || s.stop != -1){      while(t){  //只要结点不为空就应该入栈保存,与其左右结点无关         printf("%c ",t->data);        push(&s,t);        t= t->lchild;      }      t=pop(&s);      t=t->rchild;    }  }}

2、中序遍历

void midorder(bintree t){  seqstack s;  s.top = -1;  if(!t){    printf("the tree is empty!\n");  }else{    while(t ||s.top != -1){      while(t){        push(&s,t);        t= t->lchild;      }      t=pop(&s);      printf("%c ",t->data);      t=t->rchild;    }  }}

3、后序遍历

因为后序遍历最后还要要访问根结点一次,所以要访问根结点两次。采取夹标志位的方法解决这个问题。

这段代码非常纠结,对自己有信心的朋友可以尝试独立写一下。反正我是写了很长时间。逻辑不难,我画了一张逻辑图:

C语言中二叉树的常见操作是什么

代码:

void postorder_dev(bintree t){  seqstack s;  s.top = -1;  if(!t){    printf("the tree is empty!\n");  }else{    while(t || s.top != -1){  //栈空了的同时t也为空。      while(t){        push(&s,t);        s.tag[s.top] = 0;  //设置访问标记,0为第一次访问,1为第二次访问        t= t->lchild;      }      if(s.tag[s.top] == 0){ //第一次访问时,转向同层右结点        t= s.data[s.top];  //左走到底时t是为空的,必须有这步!        s.tag[s.top]=1;        t=t->rchild;      }else {        while (s.tag[s.top] == 1){ //找到栈中下一个第一次访问的结点,退出循环时并没有pop所以为其左子结点          t = pop(&s);          printf("%c ",t->data);        }        t = NULL; //必须将t置空。跳过向左走,直接向右走      }    }  }}

4、层次遍历:即每一层从左向右输出

元素需要储存有先进先出的特性,所以选用队列存储。

队列的定义:

#define MAX 1000typedef struct seqqueue{  bintree data[MAX];  int front;  int rear;}seqqueue;void enter(seqqueue *q,bintree t){  if(q->rear == MAX){    printf("the queue is full!\n");  }else{    q->data[q->rear] = t;    q->rear++;  }}bintree del(seqqueue *q){  if(q->front == q->rear){    return NULL;  }else{    q->front++;    return q->data[q->front-1];  }}

遍历实现

void level_tree(bintree t){  seqqueue q;  bintree temp;  q.front = q.rear = 0;  if(!t){    printf("the tree is empty\n");    return ;  }  enter(&q,t);  while(q.front != q.rear){    t=del(&q);    printf("%c ",t->data);    if(t->lchild){      enter(&q,t->lchild);    }    if(t->rchild){      enter(&q,t->rchild);    }  }}

5、利用前序遍历的结果生成二叉树

//递归调用,不存点,想的时候只关注于一个点,因为还会回来的,不要跟踪程序运行,否则容易多加循环void createtree(bintree *t){  datatype c;  if((c=getchar()) == '#')    *t = NULL;  else{    *t = (bintree)malloc(sizeof(BinNode));    (*t)->data = c;    createtree(&(*t)->lchild);    createtree(&(*t)->rchild);  }}

6、二叉树的查找

bintree search_tree(bintree t,datatype x){  if(!t){    return NULL;  }  if(t->data == x){    return t;  }else{    if(!search_tree(t->lchild,x)){      return search_tree(t->rchild,x);    }    return t;  }}

7、统计结点个数

int count_tree(bintree t){  if(t){    return (count_tree(t->lchild)+count_tree(t->rchild)+1);  }  return 0;}

8、比较两个树是否相同

int is_equal(bintree t1,bintree t2){  if(!t1 && !t2){   //都为空就相等    return 1;  }  if(t1 && t2 && t1->data == t2->data){   //有一个为空或数据不同就不判断了    if(is_equal(t1->lchild,t2->lchild))      if(is_equal(t1->rchild,t2->rchild)){        return 1;      }  }  return 0;}

9、求二叉树的深度

int hight_tree(bintree t){  int h,left,right;  if(!t){    return 0;  }  left = hight_tree(t->lchild);  right = hight_tree(t->rchild);  h = (left>right?left:right)+1;  return h;}

感谢各位的阅读,以上就是“C语言中二叉树的常见操作是什么”的内容了,经过本文的学习后,相信大家对C语言中二叉树的常见操作是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: C语言中二叉树的常见操作是什么

本文链接: https://www.lsjlt.com/news/253022.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C语言中二叉树的常见操作是什么
    这篇文章主要讲解了“C语言中二叉树的常见操作是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C语言中二叉树的常见操作是什么”吧!一、基本概念每个结点最多有两棵子树,左子树和右子树,次序不...
    99+
    2023-06-08
  • C语言二叉树的操作方法
    本篇内容主要讲解“C语言二叉树的操作方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言二叉树的操作方法”吧!二叉树分类满二叉树除最后一层无任何子节点外,每一层上的所有结点都有两个子结点的二...
    99+
    2023-06-30
  • C语言实现BST二叉排序树的基本操作
    本文实例为大家分享了C语言实现BST二叉排序树的基本操作代码,供大家参考,具体内容如下 BST-二叉排序树的几个基本操作。 头文件声明与函数定义 #include <std...
    99+
    2022-11-12
  • C语言链式二叉树结构原理是什么
    这篇文章主要介绍“C语言链式二叉树结构原理是什么”,在日常操作中,相信很多人在C语言链式二叉树结构原理是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言链式二叉树结构原理是什么”的疑惑有所帮助!接下来...
    99+
    2023-06-25
  • C语言二叉树的概念是什么及怎么使用
    本篇内容主要讲解“C语言二叉树的概念是什么及怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言二叉树的概念是什么及怎么使用”吧!1.二叉树的概念及结构 ①概念:一棵二叉树是结...
    99+
    2023-06-29
  • C语言数据结构详细解析二叉树的操作
    目录二叉树分类二叉树性质性质的使用二叉树的遍历前序遍历中序遍历后序遍历层序遍历求二叉树的节点数求二叉树叶子结点个数求二叉树的最大深度二叉树的销毁二叉树分类 满二叉树 除最后一层无任何...
    99+
    2022-11-13
  • C语言中常见的文件操作方法是什么
    今天小编给大家分享一下C语言中常见的文件操作方法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1.为什么使用文件大家在...
    99+
    2023-07-02
  • C++ LeeCode二叉树的中序遍历是什么
    这篇文章主要介绍了C++ LeeCode二叉树的中序遍历是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C++ LeeCode二叉树的中序遍历是什么文章都会有所收获,下面我们一起来看看吧。一、题目二、代码c...
    99+
    2023-06-19
  • C语言常见的文件操作函数有什么
    这篇文章给大家介绍C语言常见的文件操作函数有什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、文件的打开和关闭1、文件指针每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名字,...
    99+
    2023-06-26
  • C语言开发中的常见错误是什么
    这篇“C语言开发中的常见错误是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C语言开发中的常见错误是什么”文章吧。一、编...
    99+
    2023-06-30
  • 深入了解C语言中常见的文件操作方法
    目录1.为什么使用文件2.什么是文件2.1文件分类2.2 文件名3.文件的打开和关闭3.1文件指针3.2 如何使用文件指针4.文件的读写1.为什么使用文件 大家在写程序的时候有没有一...
    99+
    2022-11-13
  • C语言文件的操作流程是什么
    这篇文章主要介绍“C语言文件的操作流程是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C语言文件的操作流程是什么”文章能帮助大家解决问题。为什么使用文件前面写的通讯录,增加人数退出程序后,数据就...
    99+
    2023-06-29
  • C 语言中 static 的作用是什么
    这篇文章给大家介绍C 语言中 static 的作用是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。static 用来说明静态变量。如果是在函数外面定义的,那么其效果和全局变量类似,但是,static定义的变量只能在...
    99+
    2023-06-03
  • c语言中auto的作用是什么
    在C语言中,auto是一种存储类说明符,用于声明自动变量。auto关键字可以用来显式声明变量,默认情况下所有局部变量都是自动变量,所...
    99+
    2023-10-28
    c语言
  • C语言中常用的头文件是什么
    这篇文章主要介绍“C语言中常用的头文件是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C语言中常用的头文件是什么”文章能帮助大家解决问题。1.<stdio.h>:定义了输入输出函数、...
    99+
    2023-06-17
  • assert在C语言中的作用是什么
    在C语言中,assert的作用是用于在程序中验证假设条件的正确性。它用于检查断言是否为真,如果断言为假,则会导致程序终止,并输出相应...
    99+
    2023-09-20
    assert C语言
  • C语言中链表的作用是什么
    C语言中链表的作用是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。首先,指针计算机中的所有内容都是数字。在C语言中创建变量时,编译器仅按地址处理它,但是在您...
    99+
    2023-06-16
  • printf在c语言中的作用是什么
    在C语言中,`printf` 是一个输出函数,用于将数据打印到标准输出(通常是终端窗口)上。它是C语言标准库中的一个函数,用于格式化...
    99+
    2023-09-04
    c语言
  • c语言中常量定义的规则是什么
    本篇内容介绍了“c语言中常量定义的规则是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!c语言常量定义规则常量的定义:常量是指在程序运行过...
    99+
    2023-06-08
  • c语言中strlen函数的作用是什么
    strlen函数用于计算一个字符串的长度,即字符串中字符的个数(不包括字符串末尾的空字符'0')。它是C语言中的标准库函数,需要包含...
    99+
    2023-10-18
    c语言
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作