C语言实现二叉树(二叉链表)
文章目录
- 定义结构体
- 初始化
- 先序遍历创建二叉树
- 方法一
- 测试
- 方法二:根据所给的字符串序列创建
- 其他方法
- 树的结点大小
- 树的高
- 判断树空
- 找某个结点的左孩子和右孩子
- 找某个结点的父节点
- 查找元素
- 拷贝树
- 清空树
定义结构体
#define ElemType char
typedef struct BinTreeNode {//树结点结构体,每一个数据结点对应于一个存储单元,一个数据结点包括3部分ElemType data;struct BinTreeNode* LeftChild;struct BinTreeNode* RightChild;
}BinTreeNode;typedef struct BinTree {//树结构体BinTreeNode* root;//指向树的第一个结点——根结点ElemType refvalue;//结束标记‘#’,是字符类型
};
初始化
void InitBinTree(BinTree *bt, ElemType ref){bt->root = NULL;//一开始树中无结点bt->refvalue = ref;
}
先序遍历创建二叉树
方法一
//1按照先序次序输入二叉树中结点的值,构造二叉链表表示的二叉树bt
void CreateBinTree_1(BinTree *bt) {CreateBinTree_1(bt, &(bt->root));//参数的传递都需要地址
}
void CreateBinTree_1(BinTree *bt, BinTreeNode **t) {//*t代表根节点的地址,这里参数的传递都需要地址,所以这里是指向根节点地址的地址//先把根节点传进去ElemType item;printf("请输入输入二叉树的元素:");scanf("%c", &item);if (item == bt->refvalue) {(*t) == NULL;//根节点为结束标记说明树为空}else {//创建根节点(分配空间)(*t) = (BinTreeNode*)malloc(sizeof(BinTreeNode));assert((*t) != NULL);(*t)->data = item;//递归根的左右子树,继续创建CreateBinTree_1(bt, &((*t)->LeftChild));CreateBinTree_1(bt, &((*t)->RightChild));}
}//调用void main() {BinTree bt;InitBinTree(&bt, '#');CreateBinTree_1(&bt);//这样就不用在外面调用结构体的成员
}
测试
插入A
插入B
插入C
插入D
方法二:根据所给的字符串序列创建
注意参数char *&str,对字符采用引用
void CreateBinTree_4(BinTree *bt, char *str) {CreateBinTree_4(bt, bt->root, str);
}
void CreateBinTree_4(BinTree *bt, BinTreeNode *&t, char *&str) {//BinTreeNode *&t 是根结点,BinTreeNode *类型if (*str == bt->refvalue) {t = NULL;}else {t = (BinTreeNode*)malloc(sizeof(BinTreeNode));t->data = *str;//*str代表指针指向字符串的第一个字符CreateBinTree_4(bt, t->LeftChild, ++str);CreateBinTree_4(bt, t->RightChild, ++str);}
}void main() {BinTree bt;InitBinTree(&bt, '#');char *str = "ABC##D##G##";CreateBinTree_4(&bt,str);
}
对字符串指针传递的分析
实际上str1与str2参数之间应该传递的是指向字符串地址的地址
其他方法
树的结点大小
递归根的左右孩子
int Size(BinTree *bt) {return Size(bt->root);
}
int Size(BinTreeNode *t) {if (t == NULL)return 0;else {return Size(t->LeftChild) + Size(t->RightChild)+1;}
}
树的高
int Height(BinTree *bt) {return Height(bt->root);
}
int Height(BinTreeNode *t) {if (t == NULL)return 0;else {int LeftHeight = Height(t->LeftChild);int RightHeight = Height(t->RightChild);return (LeftHeight > RightHeight? LeftHeight:RightHeight) + 1;}
}
判断树空
bool BinTreeEmpty(BinTree *bt) {return bt->root == NULL;
}
找某个结点的左孩子和右孩子
BinTreeNode* LeftChild(BinTreeNode *p) {if (p == NULL)return NULL;return p->LeftChild;
}
BinTreeNode* RightChild(BinTreeNode *p) {if (p == NULL)return NULL;return p->RightChild;
}
找某个结点的父节点
BinTreeNode* Parent(BinTree *bt, BinTreeNode *p) {//给出一个结点的地址找父节点return Parent(bt, p);
}
BinTreeNode* Parent(BinTreeNode *t, BinTreeNode *p) {if (t == NULL || p == NULL)return NULL;if (t->LeftChild == p || t->RightChild == p) {//从根节点开始找return t;}else {//看根节点的左右孩子是否是p的左右节点BinTreeNode* q = Parent(t->LeftChild,p);if (q != NULL) {return q;}return Parent(t->RightChild,p);}
}
查找元素
BinTreeNode* Search(BinTree *bt, ElemType key) {return Search(bt->root, key);
}
BinTreeNode* Search(BinTreeNode *t, ElemType key) {if (t == NULL)return NULL;if (t->data == key) return t;BinTreeNode* p = Search(t->LeftChild,key);if (p != NULL) {return p;}else {//左孩子找不到,再去找右孩子return Search(t->RightChild, key);}
}
拷贝树
void Copy(BinTree *bt1, BinTree *bt2) {Copy(bt1->root, bt2->root);
}
void Copy(BinTreeNode *&t1, BinTreeNode *t2) {//需要用到指向 复制得到的树的根节点的 指针BinTreeNode *&t1if (t2 == NULL)t1 = NULL;else {t1 = (BinTreeNode*)malloc(sizeof(BinTreeNode));assert(t1 != NULL);t1->data = t2->data;Copy(t1->LeftChild, t2->LeftChild);Copy(t1->RightChild, t2->RightChild);}
}
清空树
void BinTreeClear(BinTree *bt) {return BinTreeClear(bt->root);
}
void BinTreeClear(BinTreeNode *&t) {//t就是一个指向各个结点的指针,因为是BinTreeNode *,所以要取这个指针的地址if (t != NULL) {BinTreeClear(t->LeftChild);BinTreeClear(t->RightChild);free(t);t = NULL;}
}
C语言实现二叉树(二叉链表)相关推荐
- C#实现二叉树--二叉链表结构
二叉树的简单介绍 关于二叉树的介绍请看这里 : 二叉树的简单介绍 http://www.cnblogs.com/JiYF/p/7048785.html 二叉链表存储结构: 二叉树的链式存储结构是指,用 ...
- 建立、遍历二叉树(二叉链表)
建立二叉树: 由于先序.中序.后序遍历的任何一个遍历结果单独都不能唯一确定一颗二叉树,因此不能直接使用其中任何一个遍历结果来构造二叉树(原因是不能确定左右子树的大小(节点数),或者说不知道子树的结束位 ...
- 理论基础 —— 二叉树 —— 二叉链表
[二叉链表] 二叉树一般采用二叉链表存储,其基本思想是:令二叉树的每个结点对应一个链表结点,链表结点除了存放与二叉树结点有关的数据信息外,还要设置指示左右孩子的指针. template<clas ...
- C语言网:二叉链表存储的二叉树
题目描述: 树形结构是一类重要的非线性数据结构,其中以树和二叉树最为常用.对于每一个结点至多只有两课子树的一类树,称其为二叉树.二叉树的链式存储结构是一类重要的数据结构,其形式定义如下: 而二叉树的前 ...
- 6-2-二叉树(二叉链表存储)-树和二叉树-第6章-《数据结构》课本源码-严蔚敏吴伟民版...
课本源码部分 第6章 树和二叉树 - 二叉树(二叉链表存储) --<数据结构>-严蔚敏.吴伟民版 源码使用说明 链接☛☛☛ <数据结构-C语言版>(严蔚敏,吴 ...
- C语言——二叉树的创建(二叉链表)
1. 引用 递归构造二叉树的过程中用到了 C++ 语言中的引用 &,引用 & 是变量别名的意思,除了变量名不一样,其他的都是指同一个东西.传参的方式有两种:一种是传值:一种是传址.引用 ...
- C语言递归实现二叉树(二叉链表)的三种遍历和销毁操作(实验)
今天写的是二叉树操作的实验,这个实验有三个部分: ①建立二叉树,采用二叉链表结构 ②先序.中序.后续遍历二叉树,输出节点值 ③销毁二叉树 二叉树的节点结构定义 typedef struct BiTNo ...
- C语言二叉树之二叉链表
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<math.h>/* 二 ...
- 数据结构-二叉链表存储的二叉树(利用先序遍历)
树形结构是一类重要的非线性数据结构,其中以树和二叉树最为常用.对于每一个结点至多只有两课子树的一类树,称其为二叉树.二叉树的链式存储结构是一类重要的数据结构,其形式定义如下: 而二叉树的前序.中序遍历 ...
最新文章
- pycharm重点插件
- 【Paper】2013_Autonomous Cooperation Between UAV and UGV to Improve Navigation and Environmental
- 【枭·音频】声随意动——浅谈《暗影火炬城》声音设计
- 华为荣耀5cvs华为v9play_华为荣耀v9play和荣耀9哪个好_华为荣耀v9play和荣耀9对比评测_飞翔教程...
- python主讲移动端自动化测试框架appium_Appium-移动端自动测试框架,如何入门?...
- 【报告分享】疫情期间抖音、快手带货趋势分析报告.pdf(附下载链接)
- spring:使用会话和请求作用域
- mongodb服务安装及部署配置
- [转载] python中字典中追加_python 中字典中的删除,pop 方法与 popitem 方法
- iOS自定义下拉列表
- XGen 苹果IOS神器一键新机改串清理超级全息备份支持IOS789超IGV8使用分享(企鹅290093670)
- python 循环语句s =2+22+222+2222之和_python基础2
- android版 git客户端下载,Pocket Git 是 Android 手机上一个 Git 客户端工具
- Python题综合练习一
- uni-app微信公众号登录
- 教会AI认识麻将牌之实践篇
- H3C Cloud Lad安装过程中的兼容性问题
- Alibaba iOS 工程架构腐化治理实践
- the markup in the document preceding the root element must be well-formed
- openVPN服务端搭建