本篇博文是博主在学习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. 在Action中操作域对象

    ----------------------siwuxie095 在 Action 中操作域对象 1.在 Action 中可以操作的域对象主要有三个: (1)Request (2)Session (3 ...

  2. Golang作用域—坑

    先举个栗子,全局作用域变量,与 := 符号声明赋值新变量 package main import "fmt" var a = "GG" func main() ...

  3. nginx 负载均衡 使用ip_hash方式解决session问题 测试

    ip_hash的方式比较弱智,但是在一般情况下是挺有效的~~,如果能保证nginx是最上一层的代理,那么能够得到用户的ip是真实位置,就能做到负载,但是一家公司的所有员工其实走的是同一个ip,那么在这 ...

  4. C#使用互斥量(Mutex)实现多进程并发操作时多进程间线程同步操作(进程同步)的简单示例代码及使用方法

    本文主要是实现操作系统级别的多进程间线程同步(进程同步)的示例代码及测试结果.代码经过测试,可供参考,也可直接使用. 承接上一篇博客的业务场景[C#使用读写锁三行代码简单解决多线程并发写入文件时线程同 ...

  5. 各大主流.Net的IOC框架性能测试比较(转)

    出处:http://www.cnblogs.com/liping13599168/archive/2011/07/17/2108734.html 在上一篇中,我简单介绍了下Autofac的使用,有人希 ...

  6. Linux的磁盘分区(三)

    RAID 廉价冗余磁盘阵列 Redundant Arrays of Inexpensive Disks 不同级别的RAID功能.特性各不相同 对比项 RAID0 RAID1 RAID10 RAID5 ...

  7. 深入浅出python系列(一)包与模块

    一.包 包是由一系列模块组成的,模块简单就说是一个.py文件.比如说,现在有一个数学功能组,可以计算加.减.乘.除.幂运算等等,假定把这几个功能分成几个模块,一个模块就是一个.py文件.由这些不同的模 ...

  8. 2、Docker和虚拟机的对比

    2.1 虚拟化技术   虚拟机Virtual Machine与容器化技术(代表Docker)都是虚拟化技术,两者的区别在于虚拟化的程度不同.   Docker为代表的容器化技术并不是虚拟机.   虚拟 ...

  9. [label][Google-Developers] Your First Multi Screen Site

    内容是任何网站最重要的部分. 所以,让我们为内容而设计,而不要让设计支配内容. 1. 首先确定我们需要的内容: 2. 基于这个内容,为无论宽.窄的 viewport 创建一个页面结构: 3. 然后在简 ...

  10. [Delphi]编译条件

    当软件在多个DELPHI版本下编译时,需要处理各版本的不同情况,使用编译条件技术实现. 万一博客,编译指令基础使用介绍:http://www.cnblogs.com/del/category/1686 ...