本篇博文是博主在学习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语言数据结构之二叉树的实现的更多相关文章

  1. 算法与数据结构(三) 二叉树的遍历及其线索化(Swift版)

    前面两篇博客介绍了线性表的顺序存储与链式存储以及对应的操作,并且还聊了栈与队列的相关内容.本篇博客我们就继续聊数据结构的相关东西,并且所涉及的相关Demo依然使用面向对象语言Swift来表示.本篇博客 ...

  2. python数据结构之二叉树的统计与转换实例

    python数据结构之二叉树的统计与转换实例 这篇文章主要介绍了python数据结构之二叉树的统计与转换实例,例如统计二叉树的叶子.分支节点,以及二叉树的左右两树互换等,需要的朋友可以参考下 一.获取 ...

  3. c语言数据结构学习心得——二叉树

    二叉树 n(n>=0)个结点的有限集合:(五种形态) 1.或者为空二叉树,n=0: 2.或者由一个根结点和两个互不相交的被称为根的左子树和右子树组成.左子树和右子树又分别是一棵二叉树. 3.每个 ...

  4. 数据结构之---C语言实现线索二叉树

    //线索二叉树,这里在二叉树的基础上增加了线索化 //杨鑫 #include <stdio.h> #include <stdlib.h> typedef char ElemTy ...

  5. 数据结构(C语言版)---二叉树

    1.二叉树:任意一个结点的子结点个数最多两个,且子结点的位置不可更改,二叉树的子树有左右之分. 1)分类:(1)一般二叉树(2)满二叉树:在不增加树的层数的前提下,无法再多添加一个结点的二叉树就是满二 ...

  6. 读谭浩强C语言数据结构有感(1)

    1.什么是数据结构? 数据结构,就是我们计算机内部的运算,编程语言的基础工作模式吧,个人总结的 = = !! 数据:说简单一点,就是计算机二进制机器码,然后通过一些复杂的操作,变为复杂的语言. 数据元 ...

  7. python数据结构之二叉树的实现

    树的定义 树是一种重要的非线性数据结构,直观地看,它是数据元素(在树中称为结点)按分支关系组织起来的结构,很象自然界中的树那样.树结构在客观世界中广泛存在,如人类社会的族谱和各种社会组织机构都可用树形 ...

  8. C语言实现有序二叉树(1)

    在cpp中使用的C语言 头文件 /* 有序二叉树 BsTree */ #ifndef _BT_H #define _BT_H /*节点*/ typedef struct BsTreeNode { in ...

  9. C语言数据结构----栈与递归

    本节主要说程序中的栈函数栈的关系以及栈和递归算法的关系. 一.函数调用时的栈 1.程序调用时的栈是也就是平时所说的函数栈是数据结构的一种应用,函数调用栈一般是从搞地质向低地址增长的,栈顶为内存的低地址 ...

随机推荐

  1. 关于ueditor与arcgis js api同用会报错的问题

    在ueditor与arcgis js api共用时,需要将ueditor\third-party\zeroclipboard\ZeroClipboard.js中的 if (typeof define ...

  2. Ubuntu开机自动挂载分区

    虽然我基本上都是使用Linux的,但是仍然有些时候需要切换到Windows(双系统),如果所有的分区都使用ext4等Linux分区格式,则在Windows下访问十分不方便. 因此,我一般会将一些两个系 ...

  3. 在Linux下删除文件及文件夹(rm)

    删除目录.文件 rm(remove) 功能说明:删除文件或目录.语 法:rm [-dfirv][--help][--version][文件或目录...]补充说明:执行rm指令可删除文件或目录,如欲删除 ...

  4. for(var i=0;i<5;i++){ setTimeout(function() { console.log(i) }, 100);}

    涉及异步.作用域.闭包 1.settimeout是异步执行,100ms后往任务队列里面添加一个任务 2.let不仅将i绑定到for循环块中,事实上它将其重新绑定到循环体的每一次迭代中 3.闭包 set ...

  5. setitemdata 32位 or 64位

    我用SetItemData 和GetItemData把数据库一条数据导入到CListctrl 32位下 程序都可以跑 GetItemData能得到自定义类数据 可以64位得不到?

  6. IntelliJ IDEA 2016.1.3(64) license server 与汉化

    license server:http://idea.iteblog.com/key.php 汉化:将resources_cn.jar 复制到安装IDEA安装目录下的lib文件夹中.重新打开即可. r ...

  7. POJ1751 Highways 2017-04-14 15:46 70人阅读 评论(0) 收藏

    Highways Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 14819   Accepted: 4278   Speci ...

  8. Template Method Design Pattern in Java

    Template Method is a behavioral design pattern and it’s used to create a method stub and deferring s ...

  9. long polling

    Regular http: client 发出请求到server server 计算 response server 响应 response 给 client Polling: A client re ...

  10. mysql in语句在java中的使用

    做权限的时候,通过role角色中的roleid,在auth权限中查找角色对应的权限. sql语句: SELECT authName from auth where authId in (1,2,3,4 ...