本篇博文是博主在学习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. N 秒打开一个新窗口

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  2. shiro 和spring集合 实现登录时输入验证码并校验(七)

    编写实现验证码的主体实现类:CaptchaCode import java.util.UUID; import javax.servlet.http.HttpServletRequest; impor ...

  3. java工具类 --千分位方法

    /** * 千分位方法 * @param text * @return */ public static String fmtMicrometer(String text) { DecimalForm ...

  4. c语言蛋疼的字符串赋值

    我觉得c语言比较蛋疼的一个地方就是给字符串赋值,不是初始化,是赋值. char string[20]={0}; 你不能通过 string="hello";这种方式赋值.但是在字符串 ...

  5. Golang之继承,多重继承(struct)

    热乎的代码来了 package main import "fmt" /* 继承 一个结构体嵌到另一个结构体,称作组合 匿名和组合的区别 如果一个struct嵌套了另一个匿名结构体, ...

  6. Laravel Carbon 简明使用

    快速切換前後日期 <?php use Carbon\Carbon; $now = Carbon::now(); echo $now; // 2015-03-26 00:36:47 $today ...

  7. 饮品类App原型制作分享-WineRatingsPlus

    WineRatingsPlus是一款关于红酒的App应用.它帮助你在用餐.聚会或任何场合选择葡萄酒时,都能方便的得到专家意见.同时,它也能帮助鉴赏家和感兴趣的人对葡萄酒更多的了解和选择. 在这款Moc ...

  8. idea中代码补全

    在IDEA中,默认的代码自动提示不够智能,现在配置成更加智能的方式. File-Settings-Editor-General-Code Completion中 把最上面的大小写敏感度改成none,下 ...

  9. 用Swift实现一款天气预报APP(三)

    这个系列的目录: 用Swift实现一款天气预报APP(一) 用Swift实现一款天气预报APP(二) 用Swift实现一款天气预报APP(三) 通过前面的学习,一个天气预报的APP已经基本可用了.至少 ...

  10. 如何查看非自己提交的请求的结果 - 深入浅出Oracle EBS之杂项技术荟萃

    如何查看非自己提交的请求的结果定位要找的请求SQL举例:SELECT req.request_id,       fcp.user_concurrent_program_name,       usr ...