本篇博文是博主在学习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. 44. Wildcard Matching (String; DP, Back-Track)

    Implement wildcard pattern matching with support for '?' and '*'. '?' Matches any single character. ...

  2. unity平行光太亮?物体发白?可能你使用了2个或多个平行光

    unity平行光太亮?物体发白?可能你使用了2个或多个平行光 今天做项目时就遇到了这个问题,光亮得让物体发白 发现加载的场景 里面有个 平行光,删了就好了 要是感觉还是太亮,就把主平行光的Intens ...

  3. 从值栈获取List集合

    -------------------siwuxie095 从值栈获取 List 集合 1.具体步骤 (1)在 Action 中向值栈放 List 集合 (2)在 JSP 页面中从值栈获取 List ...

  4. 使screen支持滚动

    在Linux中,常用的串口工具有minicom和screen,minicom可能使用得比较多,但是我比较喜欢screen,因为它的输出是彩色的,更舒服.更能突出重点. 使用screen来打开串口也非常 ...

  5. Error while trying to retrieve text for error ORA-12154

    问题描述:vs中调试运行没有任何错误,但是发布到IIS中访问,就会报以上错误.IIS不会调试,所以一头雾水,不止错误在哪里. 分析:看到网上有人分析了Web.config模拟验证的问题恍然大悟: 原文 ...

  6. C语言日志处理

    一.简介 zlog是一个高可靠性.高性能.线程安全.灵活.概念清晰的纯C日志函数库,在效率.功能.安全性上大大超过了log4c,并且是用c写成的,具有比较好的通用性. 二.安装 下载 https:// ...

  7. std::time(0)找不到

    http://zh.cppreference.com/w/cpp/chrono/c/time #include <ctime> isnan找不到 http://en.cppreferenc ...

  8. [GO]redis的连接

    package main import ( "github.com/garyburd/redigo/redis" "fmt" ) var pool *redis ...

  9. [label][转载][JavaSript]querySelectorAll 方法相比 getElementsBy 系列方法有什么区别?

     轉載出處: http://www.zhihu.com/question/24702250 querySelectorAll 相比下面这些方法有什么区别? getElementsByTagName g ...

  10. ERROR Function not available to this responsibility.Change responsibilities or contact your System Administrator.

    APPLIES TO: Navigation:  Help > Diagnostics > Custom Code > Personalize  or  Help > Diag ...