数据结构之二叉树

有幸掌握浅薄知识,不吝分享,保持独立思考,自主学习,共同进步。另求关注,点赞,评论,感谢!(tips:主页有数据结构全部知识点,以及知识点讲解,建立完善的数据结构知识体)

核心算法思想(重要)

先来讲一些知识点:

①结点:包含一个数据元素及若干指向子树分支的信息。
②结点的度:一个结点拥有子树的数目称为结点的度。
③叶子结点:也称为终端结点,没有子树的结点或者度为零的结点。
④分支结点:也称为非终端结点,度不为零的结点称为非终端结点。
⑤树的度:树中所有结点的度的最大值。
⑥结点的层次:从根结点开始,假设根结点为第1层,根结点的子节点为第2层,依此类推,如果某一个结点位于第L层,则其子节点位于第L+1层。
⑦树的深度:也称为树的高度,树中所有结点的层次最大值称为树的深度。

二叉树是n(n>=0)个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树组成。

简单的二叉树

完全二叉树

更多知识点看这个,讲的很详细:二叉树基础知识.

算法实现

前序遍历递归算法:

void PreOrderTraverse(BiTree T)
{if(T==NULL)return;printf("%c", T->data);  /*显示结点数据,可以更改为其他对结点操作*/PreOrderTraverse(T->lchild);    /*再先序遍历左子树*/PreOrderTraverse(T->rchild);    /*最后先序遍历右子树*/
}

中序遍历递归算法:

void InOrderTraverse(BiTree T)
{if(T==NULL)return;InOrderTraverse(T->lchild); /*中序遍历左子树*/printf("%c", T->data);  /*显示结点数据,可以更改为其他对结点操作*/InOrderTraverse(T->rchild); /*最后中序遍历右子树*/
}

后序遍历递归算法:

void PostOrderTraverse(BiTree T)
{if(T==NULL)return;PostOrderTraverse(T->lchild);   /*先后序遍历左子树*/PostOrderTraverse(T->rchild);   /*再后续遍历右子树*/printf("%c", T->data);  /*显示结点数据,可以更改为其他对结点操作*/
}

实践出真知,代码案例

编写一个程序实现二叉树的各种运算,并完成如下功能:
(1)输出二叉树b;(b为下图所示的二叉树)
(2)输出H节点的左、右孩子节点值;
(3)输出二叉树b的深度;
(4)输出二叉树b的节点个数;
(5)输出二叉树b的叶子节点个数;
(6)释放二叉树b。

案例源码

#include <stdio.h>
#include <malloc.h>
#define MaxSize 100
typedef char ElemType;
typedef struct node
{ElemType data;             //数据元素struct node *lchild;      //指向左孩子struct node *rchild;     //指向右孩子
} BTNode;void CreateBTNode(BTNode *&b, char *str);void DispBTNode(BTNode *b);BTNode *FindNode(BTNode *b, ElemType x);BTNode *LchildNode(BTNode *p);BTNode *RchildNode(BTNode *p);int BTNodeDepth(BTNode *b);void preorder(BTNode *b);void inorder(BTNode *b);void postorder(BTNode *b);int Nodes(BTNode *b);int LeafNodes(BTNode *b);void DestroyBTNode(BTNode *&b);
void CreateBTNode(BTNode *&b, char *str)        //由str串创建二叉链
{BTNode *St[MaxSize], *p = NULL;int top = -1, k, j = 0;char ch;b = NULL;                //建立的二叉树初始时为空ch = str[j];while (ch != '\0') //str未扫描完时循环{switch (ch){case '(':top++; St[top] = p; k = 1; break;       //为左节点case ')':top--; break;case ',':k = 2; break;                         //为右节点default:p = (BTNode *)malloc(sizeof(BTNode));p->data = ch; p->lchild = p->rchild = NULL;if (b == NULL)                    //p指向二叉树的根节点b = p;else                              //已建立二叉树根节点{switch (k){case 1:St[top]->lchild = p; break;case 2:St[top]->rchild = p; break;}}}j++;ch = str[j];}
}void preorder(BTNode *b)
{if(b!=NULL){printf("%c",b->data);preorder(b->lchild);preorder(b->rchild);}
}
void inorder(BTNode *b)
{if(b!=NULL){preorder(b->lchild);printf("%c",b->data);preorder(b->rchild);}
}
void postorder(BTNode *b)
{if(b!=NULL){preorder(b->lchild);preorder(b->rchild);printf("%c",b->data);}
}void DispBTNode(BTNode *b) //以括号表示法输出二叉树
{if (b != NULL){printf("%c", b->data);if (b->lchild != NULL || b->rchild != NULL){printf("(");DispBTNode(b->lchild);if (b->rchild != NULL) printf(",");DispBTNode(b->rchild);printf(")");}}
}
BTNode *FindNode(BTNode *b, ElemType x) //返回data域为x的节点指针
{BTNode *p;if (b == NULL)return NULL;else if (b->data == x)return b;else{p = FindNode(b->lchild, x);if (p != NULL)return p;elsereturn FindNode(b->rchild, x);}
}
BTNode *LchildNode(BTNode *p)   //返回*p节点的左孩子节点指针
{return p->lchild;
}
BTNode *RchildNode(BTNode *p)   //返回*p节点的右孩子节点指针
{return p->rchild;
}
int BTNodeDepth(BTNode *b)  //求二叉树b的深度
{int lchilddep, rchilddep;if (b == NULL)return(0);                            //空树的高度为0else{lchilddep = BTNodeDepth(b->lchild);   //求左子树的高度为lchilddeprchilddep = BTNodeDepth(b->rchild);  //求右子树的高度为rchilddepreturn (lchilddep>rchilddep) ? (lchilddep + 1) : (rchilddep + 1);}
}int Nodes(BTNode *b)   //求二叉树b的节点个数
{int num1, num2;if (b == NULL)return 0;else if (b->lchild == NULL && b->rchild == NULL)return 1;else{num1 = Nodes(b->lchild);num2 = Nodes(b->rchild);return (num1 + num2 + 1);}
}
int LeafNodes(BTNode *b)    //求二叉树b的叶子节点个数
{int num1, num2;if (b == NULL)return 0;else if (b->lchild == NULL && b->rchild == NULL)return 1;else{num1 = LeafNodes(b->lchild);num2 = LeafNodes(b->rchild);return (num1 + num2);}
}
void DestroyBTNode(BTNode *&b)   //摧毁树
{if (b != NULL){DestroyBTNode(b->lchild);DestroyBTNode(b->rchild);free(b);}
}
int main()
{BTNode *b, *p, *lp, *rp;;CreateBTNode(b, "A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))");printf("二叉树的基本运算如下:\n");printf("  (1)输出二叉树:"); DispBTNode(b); printf("\n");printf("  (2)H节点:");p = FindNode(b, 'H');if (p != NULL){lp = LchildNode(p);if (lp != NULL)printf("左孩子为%c ", lp->data);elseprintf("无左孩子 ");rp = RchildNode(p);if (rp != NULL)printf("右孩子为%c", rp->data);elseprintf("无右孩子 ");}printf("\n");printf("  (3)二叉树b的深度:%d\n", BTNodeDepth(b));printf("  (4)二叉树b的节点个数:%d\n", Nodes(b));printf("  (5)二叉树b的叶子节点个数:%d\n", LeafNodes(b));printf("  (6)先序遍历二叉树b:");preorder(b);printf("\n");printf("  (7)中序遍历二叉树b:");inorder(b);printf("\n");printf("  (8)后序遍历二叉树b:");postorder(b);printf("\n");printf("  (9)释放二叉树b\n");DestroyBTNode(b);return 0;
}

大一新生必看,自学必看,里昂详解数据结构之二叉树相关推荐

  1. 大一新生必看,自学必看,里昂详解数据结构之队列

    数据结构之队列 有幸掌握浅薄知识,不吝分享,保持独立思考,自主学习,共同进步.另求关注,点赞,评论,感谢!(tips:主页有数据结构全部知识点,以及知识点讲解,建立完善的数据结构知识体) 核心算法思想 ...

  2. 大一新生必看,自学必看,里昂详解数据结构之图

    数据结构之图 有幸掌握浅薄知识,不吝分享,保持独立思考,自主学习,共同进步.另求关注,点赞,评论,感谢!(tips:主页有数据结构全部知识点,以及知识点讲解,建立完善的数据结构知识体) 核心算法思想 ...

  3. 大一新生必看,自学必看,里昂详解数据结构之链表

    数据结构之链表 有幸掌握浅薄知识,不吝分享,保持独立思考,自主学习,共同进步.另求关注,点赞,评论,感谢!(tips:主页有数据结构全部知识点,以及知识点讲解,建立完善的数据结构知识体) 核心算法思想 ...

  4. 大一新生必看,自学必看,里昂详解数据结构之线性表

    数据结构之线性表(顺序表) 有幸掌握浅薄知识,不吝分享,保持独立思考,自主学习,共同进步.另求关注,点赞,评论,感谢!(tips:主页有数据结构全部知识点,以及知识点讲解,建立完善的数据结构知识体) ...

  5. 大一新生必看,自学必看,里昂详解数据结构之堆栈

    数据结构之堆栈 有幸掌握浅薄知识,不吝分享,保持独立思考,自主学习,共同进步.另求关注,点赞,评论,感谢!(tips:主页有数据结构全部知识点,以及知识点讲解,建立完善的数据结构知识体) 核心算法思想 ...

  6. 大一新生上手题(题目加源代码详解)(每日一题,一题多解)

    2019 数列有序! Problem Description 有n(n<=100)个整数,已经按照从小到大顺序排列好,现在另外给一个整数x,请将该数插入到序列中,并使新的序列仍然有序.n从键盘输 ...

  7. 思科ccna认证工程师必看路由协议IGRP和EIGRP详解

    思科ccna认证工程师必看路由协议IGRP和EIGRP详解单单从他们的名字当中,我们就能猜到他们之间有很多的关联. IGRP: 一种内部网关路由协议,它由Cisco公司八十年代中期设计.使用组合用户配 ...

  8. 一看就懂的CE-NET详解

    一看就懂的CE-NET详解 针对问题 u-net及其变体存在限制,连续的pooling和交错的卷积运算会导致一些空间信息的丢失. 文章贡献 提出了一个DAC模块和一个RMP模块来捕获更多的高级特征并保 ...

  9. 计算机bios设置论文,玩转电脑必看知识——各种BIOS设置详解 的更多相关文章

    7.IDE Primary Master UDMA(第一个IDE主控制器下的UDMA模式) 8.IDE Primary Slave UDMA(第一个IDE从控制器下的UDMA模式) 9.IDE Sec ...

最新文章

  1. 【HNOI2011】数学作业(BZOJ 2326)
  2. TF之DD:实现输出Inception模型内的某个卷积层或者所有卷积层的形状
  3. 扔掉工具类,Mybatis一个简单配置搞定数据加密解密!
  4. powershell 运行策略
  5. 梁家卿 | 百科知识图谱同步更新
  6. html宽度满屏,宽度满屏的代码怎么样写?
  7. 电赛练习之旋转倒立摆
  8. app源码 php,PHP大型B2B2C商城源码带APP源码
  9. Docker学习总结(45)——Docker在沪江落地的实践
  10. linux安装btsync
  11. ArcGIS实验教程——实验三十:地图注记与标注(标注转注记)用法案例详解
  12. python向量运算_Python线性代数学习笔记——向量的基本运算,以及Python代码的实现...
  13. HTTP请求报文和响应报文、http协议状态码分类和常用状态码、Cookie、curl工具、httpd自带的工具、压力测试工具
  14. cad图纸怎么转换成图片?
  15. Android开发学习—指纹识别系统的原理与使用
  16. Protractor 环境搭建
  17. 百度SEO蓝色eBook电子书企业网站模板
  18. 哥哥教你学嵌入式 之 智芯科技 开发板 Z20K11x系列 教程(一)
  19. mysql查找操作返回值出现 - [User{id=1, userName='null', date=Sun Sep 16 00:00:00 CST 2018}]
  20. 如何搭建 Cinder UT测试环境?

热门文章

  1. Java 10年回顾:世界各地开发高手谈Java
  2. 虚拟机没有网络教你如何解决
  3. HTML学生个人网站作业设计:电影网站设计——漫威电影(2页) HTML+CSS+JavaScript 简单DIV布局个人介绍网页模板代码 DW学生个人网站制作成品下载
  4. 学生信息管理系统-web项目实训(基于JAVA)
  5. 香港云服务器网站打开缓慢,香港云服务器搭建的网站卡慢怎么办?火星直播
  6. 网页数据库服务器连接超时,数据库服务器连接超时
  7. FFMpeg编译之路
  8. 三件套都有什么_床上用品三件套,四件套,五件套,七件套分别包括的是哪些...
  9. NER依存关系模型:原理,建模及代码实现
  10. HTML5定稿了 为什么原生App世界将被颠覆