文章目录

  • 定义结构体
  • 初始化
  • 先序遍历创建二叉树
    • 方法一
      • 测试
    • 方法二:根据所给的字符串序列创建
  • 其他方法
    • 树的结点大小
    • 树的高
    • 判断树空
    • 找某个结点的左孩子和右孩子
    • 找某个结点的父节点
    • 查找元素
    • 拷贝树
    • 清空树

定义结构体

#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语言实现二叉树(二叉链表)相关推荐

  1. C#实现二叉树--二叉链表结构

    二叉树的简单介绍 关于二叉树的介绍请看这里 : 二叉树的简单介绍 http://www.cnblogs.com/JiYF/p/7048785.html 二叉链表存储结构: 二叉树的链式存储结构是指,用 ...

  2. 建立、遍历二叉树(二叉链表)

    建立二叉树: 由于先序.中序.后序遍历的任何一个遍历结果单独都不能唯一确定一颗二叉树,因此不能直接使用其中任何一个遍历结果来构造二叉树(原因是不能确定左右子树的大小(节点数),或者说不知道子树的结束位 ...

  3. 理论基础 —— 二叉树 —— 二叉链表

    [二叉链表] 二叉树一般采用二叉链表存储,其基本思想是:令二叉树的每个结点对应一个链表结点,链表结点除了存放与二叉树结点有关的数据信息外,还要设置指示左右孩子的指针. template<clas ...

  4. C语言网:二叉链表存储的二叉树

    题目描述: 树形结构是一类重要的非线性数据结构,其中以树和二叉树最为常用.对于每一个结点至多只有两课子树的一类树,称其为二叉树.二叉树的链式存储结构是一类重要的数据结构,其形式定义如下: 而二叉树的前 ...

  5. 6-2-二叉树(二叉链表存储)-树和二叉树-第6章-《数据结构》课本源码-严蔚敏吴伟民版...

    课本源码部分 第6章  树和二叉树 - 二叉树(二叉链表存储) --<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接☛☛☛ <数据结构-C语言版>(严蔚敏,吴 ...

  6. C语言——二叉树的创建(二叉链表)

    1. 引用 递归构造二叉树的过程中用到了 C++ 语言中的引用 &,引用 & 是变量别名的意思,除了变量名不一样,其他的都是指同一个东西.传参的方式有两种:一种是传值:一种是传址.引用 ...

  7. C语言递归实现二叉树(二叉链表)的三种遍历和销毁操作(实验)

    今天写的是二叉树操作的实验,这个实验有三个部分: ①建立二叉树,采用二叉链表结构 ②先序.中序.后续遍历二叉树,输出节点值 ③销毁二叉树 二叉树的节点结构定义 typedef struct BiTNo ...

  8. C语言二叉树之二叉链表

    #include<stdio.h> #include<stdlib.h> #include<string.h> #include<math.h>/* 二 ...

  9. 数据结构-二叉链表存储的二叉树(利用先序遍历)

    树形结构是一类重要的非线性数据结构,其中以树和二叉树最为常用.对于每一个结点至多只有两课子树的一类树,称其为二叉树.二叉树的链式存储结构是一类重要的数据结构,其形式定义如下: 而二叉树的前序.中序遍历 ...

最新文章

  1. pycharm重点插件
  2. 【Paper】2013_Autonomous Cooperation Between UAV and UGV to Improve Navigation and Environmental
  3. 【枭·音频】声随意动——浅谈《暗影火炬城》声音设计
  4. 华为荣耀5cvs华为v9play_华为荣耀v9play和荣耀9哪个好_华为荣耀v9play和荣耀9对比评测_飞翔教程...
  5. python主讲移动端自动化测试框架appium_Appium-移动端自动测试框架,如何入门?...
  6. 【报告分享】疫情期间抖音、快手带货趋势分析报告.pdf(附下载链接)
  7. spring:使用会话和请求作用域
  8. mongodb服务安装及部署配置
  9. [转载] python中字典中追加_python 中字典中的删除,pop 方法与 popitem 方法
  10. iOS自定义下拉列表
  11. XGen 苹果IOS神器一键新机改串清理超级全息备份支持IOS789超IGV8使用分享(企鹅290093670)
  12. python 循环语句s =2+22+222+2222之和_python基础2
  13. android版 git客户端下载,Pocket Git 是 Android 手机上一个 Git 客户端工具
  14. Python题综合练习一
  15. uni-app微信公众号登录
  16. 教会AI认识麻将牌之实践篇
  17. H3C Cloud Lad安装过程中的兼容性问题
  18. Alibaba iOS 工程架构腐化治理实践
  19. the markup in the document preceding the root element must be well-formed
  20. openVPN服务端搭建

热门文章

  1. jsp软件公司员工管理系统
  2. 如何避免SCI写作中的中式思维以及无处不在的Chinglish
  3. 阿里云企业邮箱免费版、标准版、集团版和尊享版区别
  4. 【WPF】 关于在WPF应用中使用Joystick
  5. 阿里深度学习的“金刚钻”——千亿特征XNN算法及其落地实践
  6. 最全的网络硬盘(免费)
  7. 椭圆曲线介绍(一):实数上面的椭圆曲线
  8. sysbench工具测试达梦数据库
  9. 静态代码检查工具 FindBugs
  10. java 随机生成n个整数_java随机生成n个不相同的整数