C语言数据结构之二叉树的实现
本篇博文是博主在学习C语言算法与数据结构的一些应用代码实例,给出了以二叉链表的形式实现二叉树的相关操作。如创建,遍历(先序,中序后序遍历),求树的深度,树的叶子节点数,左右兄弟,父节点。
代码清单如下:
#pragma once
#include<stdio.h>
#include"stdlib.h"
typedef char TElemType;
typedef struct BiTNode
{
TElemType data;
struct BiTNode *lchild, *rchild; }BiTNode, *BiTree;
void InitBiTree(BiTree&T)
{
T = NULL;
} //创建二叉树
int CreateBiTree(BiTree&T)
{
printf("请输入树的节点:");
TElemType ch;
getchar();
scanf("%c", &ch);
if (ch == ' ')
{
T = NULL; }
else
{
T = (BiTNode*)malloc(sizeof(BiTNode));
if (!T)
{
exit(EOVERFLOW);
}
T->data = ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
return true;
} //判断二叉树是否为空
int BiTreeEmpty(BiTree&T)
{
if (T)
{
return false;
}
else
{
return true;
}
} //求树的深度
int BiTreeDepth(BiTree T)
{
int i, j;
if (!T)
{
return ;
}
if (T->lchild)
{
i = BiTreeDepth(T->lchild);
}
else
{
i = ;
}
if (T->rchild)
{
j = BiTreeDepth(T->rchild);
}
else
{
j = ;
}
return i > j ? i + : j + ;
} //打印节点
void Visit(TElemType e)
{
printf("%c", e);
} //以递归形式先序遍历二叉树
void PreOrderTraverse(BiTree T, void(*Visit)(TElemType))
{
if (T)
{
Visit(T->data);
PreOrderTraverse(T->lchild, Visit);
PreOrderTraverse(T->rchild, Visit);
}
}
//以递归形式中序遍历二叉树
void InOrderTraverse(BiTree T, void(*Visit)(TElemType))
{
if (T)
{
InOrderTraverse(T->lchild, Visit);
Visit(T->data);
InOrderTraverse(T->rchild, Visit);
}
} //以递归形式后序遍历二叉树
void PostOrderTraverse(BiTree T, void(*Visit)(TElemType))
{
if (T)
{
PostOrderTraverse(T->lchild, Visit);
PostOrderTraverse(T->rchild, Visit);
Visit(T->data);
}
} //计算叶子节点数
int CountLeaf(BiTree &T, int &count)
{
if (T)
{ if ((T->lchild == NULL) && (T->rchild == NULL))
{ count++;
}
CountLeaf(T->lchild, count);
CountLeaf(T->rchild, count);
}
return count; //返回叶子节点数
}
int max(int a, int b)
{
return a > b ? a : b;
} //求父节点的值 注意返回值为char类型
char Parent(BiTree T, ElemType e) //二叉树存在,e是T中某个节点,若e为非根结点,则返回它的双亲,否则返回空
{ if (T != NULL)
{
if ((T->lchild && (T->lchild->data == e)) || (T->rchild && (T->rchild->data == e)))
return(T->data);
else
{
Parent(T->lchild, e);
Parent(T->rchild, e);
}
}
return ' '; } //寻找某个节点
BiTree FindNode(BiTree T, char e) //返回指向这个节点的指针
{
if (T == NULL)
{
return NULL;
}
if (T->data == e)
{
return T;
}
BiTree node;
if ((node = FindNode(T->lchild, e)) != NULL)
return node;
else
return FindNode(T->rchild, e);
} //输出某个节点的左兄弟
void LeftSibling(BiTree &T, char e)
{
char ch = Parent(T, e);
BiTree tmp = FindNode(T, ch);
if (tmp->lchild != NULL)
{
if (tmp->lchild->data != e)
{
printf("此节点的左兄弟为:%c ", tmp->lchild->data);
}
else
{
printf("此节点没有左兄弟 ");
}
//return tmp->lchild->data;
}
else
{
printf("此节点没有左兄弟 "); }
} //输出某个节点的左兄弟
void RightSibling(BiTree &T, char e)
{
char ch = Parent(T, e);
BiTree tmp = FindNode(T, ch);
if (tmp->rchild != NULL)
{
if (tmp->rchild->data != e)
printf("此节点的右兄弟为:%c \n", tmp->rchild->data);
//return tmp->rchild->data;
else
{
printf("此节点没有右兄弟 ");
}
}
else
{
printf("此节点没有右兄弟 "); }
}
C语言数据结构之二叉树的实现的更多相关文章
- 算法与数据结构(三) 二叉树的遍历及其线索化(Swift版)
前面两篇博客介绍了线性表的顺序存储与链式存储以及对应的操作,并且还聊了栈与队列的相关内容.本篇博客我们就继续聊数据结构的相关东西,并且所涉及的相关Demo依然使用面向对象语言Swift来表示.本篇博客 ...
- python数据结构之二叉树的统计与转换实例
python数据结构之二叉树的统计与转换实例 这篇文章主要介绍了python数据结构之二叉树的统计与转换实例,例如统计二叉树的叶子.分支节点,以及二叉树的左右两树互换等,需要的朋友可以参考下 一.获取 ...
- c语言数据结构学习心得——二叉树
二叉树 n(n>=0)个结点的有限集合:(五种形态) 1.或者为空二叉树,n=0: 2.或者由一个根结点和两个互不相交的被称为根的左子树和右子树组成.左子树和右子树又分别是一棵二叉树. 3.每个 ...
- 数据结构之---C语言实现线索二叉树
//线索二叉树,这里在二叉树的基础上增加了线索化 //杨鑫 #include <stdio.h> #include <stdlib.h> typedef char ElemTy ...
- 数据结构(C语言版)---二叉树
1.二叉树:任意一个结点的子结点个数最多两个,且子结点的位置不可更改,二叉树的子树有左右之分. 1)分类:(1)一般二叉树(2)满二叉树:在不增加树的层数的前提下,无法再多添加一个结点的二叉树就是满二 ...
- 读谭浩强C语言数据结构有感(1)
1.什么是数据结构? 数据结构,就是我们计算机内部的运算,编程语言的基础工作模式吧,个人总结的 = = !! 数据:说简单一点,就是计算机二进制机器码,然后通过一些复杂的操作,变为复杂的语言. 数据元 ...
- python数据结构之二叉树的实现
树的定义 树是一种重要的非线性数据结构,直观地看,它是数据元素(在树中称为结点)按分支关系组织起来的结构,很象自然界中的树那样.树结构在客观世界中广泛存在,如人类社会的族谱和各种社会组织机构都可用树形 ...
- C语言实现有序二叉树(1)
在cpp中使用的C语言 头文件 /* 有序二叉树 BsTree */ #ifndef _BT_H #define _BT_H /*节点*/ typedef struct BsTreeNode { in ...
- C语言数据结构----栈与递归
本节主要说程序中的栈函数栈的关系以及栈和递归算法的关系. 一.函数调用时的栈 1.程序调用时的栈是也就是平时所说的函数栈是数据结构的一种应用,函数调用栈一般是从搞地质向低地址增长的,栈顶为内存的低地址 ...
随机推荐
- PHP里的进制
1.进制转换函数: <?php function decto_bin($datalist,$bin) { static $arr=array(0,1,2,3,4,5,6,7,8,9,'A','B ...
- Django基础模板案例
想要用django 访问一个页面 同时传参数过去.在页面中接受参数 案例:附代码 #创建一个项目 项目名字是 yhl_test django-admin startproject yhl_test ...
- ICG游戏:尼姆游戏异或解法的证明
描述: 尼姆博奕(Nimm Game),有n堆石子,每堆石子有若干石子,两个人轮流从某一堆取任意多的物品,规定每次至少取一个,多者不限.取走最后石子的人获胜. 标准解法: 判断: 先计算先手是必胜还是 ...
- PHP中SQL查询语句的id=%d解释
在SQL语句中有一些写的是这样的: 'SELECT id FROM dbname WHERE xx_id = %d;', $bl['student_id'] 其中的“xx_id = %d”,这里的%d ...
- 20172325《Java程序设计》第一周学习总结
20172325<Java程序设计>第一周学习总结 教材学习内容总结 第一章 1.1软件质量 软件工程是一门关于高质量软件开发的技术和理论的学科. 高质量软件的特征 1.2 数据结构 软件 ...
- win10 跳过max path 260限制
参考: https://www.howtogeek.com/266621/how-to-make-windows-10-accept-file-paths-over-260-characters/ 注 ...
- 网络中的A、B、C类地址
1.A类ip地址(1.0.0.0到126.255.255.255) A类地址只有第一个8位表示网络地址,最高位一定为0,所以A类地址的网络号范围可以为:64+32+16+8+4+2+1=127,也就是 ...
- line-height:150% 和 line-height:1.5
line-height属性的细节与大多数CSS属性不同,line-height支持属性值设置为无单位的数字.有无单位在子元素继承属性时有微妙的不同. 有单位(包括百分比)与无单位之间的区别有单位时,子 ...
- HTTP请求头和响应头总结
1)请求(客户端->服务端[request]) GET(请求的方式) /books/java.html(请求的目标资源) HTTP/1.1(请求采用的协议和版本号) Accept ...
- 基于Extjs的web表单设计器 第三节——控件拖放
看过之前设计器截图的朋友应该有印象,可能会发觉我们的设计器UI设计布局其实类似Visual studio 的设计界面,采用的是左.中.右三个区域布局.左侧为控件区域.中间为表单的画布设区域.右侧为属性 ...