码迷,mamicode.com
首页 > 其他好文 > 详细

数据结构 树

时间:2016-04-24 17:01:43      阅读:133      评论:0      收藏:0      [点我收藏+]

标签:

 

  树是一种非线性的数据结构,是n(n>=0)个结点的有限集。

(1)在任意一棵树中,有且仅有一个特定的根节点。如图点A技术分享

(2)节点拥有的子树数称为结点的度。图中A的度为3,C的度为1

(3)度为0的结点称为叶子终端结点。如图KLM点

(4)度不为0的结点称为非终端结点或者分支结点。如图A B C...

(5)数的度是树内各结点的度的最大值,如图树的度是3

(6)节点的子树的根称为该结点的孩子,左侧的为左孩子,右侧的为右孩子。

   相应的,该结点称为孩子的双亲

(7)树中结点的最大层次称为树的深度高度。图所示的树的深度为4

(8)将树中结点的各子树看成从左到右是有次序(即左孩子不能和右孩子互换)

   则称该树为有序树,否则为无序树

(9)森林是m(m>=0)棵互不相交的树的集合

 

二叉树

技术分享

   二叉树是一种特殊的树形结构,它的每个结点至多只有两颗子树,即二叉树中不存在度大于2的结点,

 并且,二叉树的子树有左右之分,其次序不能任意颠倒。

(1)一棵深度为k且有2k - 1 个结点的二叉树称为 满二叉树,如图a

(2)深度为k的,有n个结点的二叉树,当且仅当其每一个结点都与深度为k的

   满二叉树中编号从1至n的结点一一对应时,称为 完全二叉树。如图b

(3)二叉树的第i层上至多只有2i-1 个结点(i>=1)

(4)深度为k的二叉树至多有2k - 1个结点(k>=1)

 

二叉树的存储结构

1.顺序存储结构

  用一组地址连续的存储单元一次自上而下,自左而右存储完全二叉树的结点元素,注意这种存储结构仅适用于完全二叉树,“0”表示不存在此结点

技术分享

2.链式存储结构

  非连续的存储结构,利用指针域把各节点连接构成链式,分别有二叉链表(数据域和指向左右子树的指针构成,下图b)和三叉链表法(数据域、指向双亲结点的指针和指向左右子树的指针构成,下图c)。

技术分享        技术分享

 

 

 二叉树的遍历

先序遍历
技术分享

  若二叉树为空,则空操作,否则

  (1)访问根节点

  (2)先序遍历左子树       先序遍历:- * a b c

  (3)先序遍历右子树

中序遍历

   若二叉树为空,则空操作,否则

  (1)中序遍历左子树

  (2)访问根节点         中序遍历:a * b - c

  (3)中序遍历右子树

后序遍历

  若二叉树为空,则空操作,否则

  (1)后序遍历左子树

  (2)后序遍历右子树       后序遍历:a b * c -

  (3)访问根节点

 

二叉树的实现:

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 typedef    char ElemType;     //数据类型
  4 typedef    int Status;         //返回值类型
  5 #define ERROR 0
  6 #define OK 1
  7 //定义二叉树结构
  8 typedef struct BiTNode{
  9     ElemType    data;                    //数据
 10     struct BiTNode    *lChild, *rChlid;    //左右子树指针
 11 }BiTNode, *BiTree;
 12 
 13 //创建二叉树
 14 Status CreateBiTree(BiTree *T)
 15 {
 16     ElemType ch;
 17     ElemType c;
 18     scanf("%c", &ch);
 19     c = getchar();
 20     if (  == ch)
 21         *T = NULL;
 22     else
 23     {
 24         *T = (BiTree)malloc(sizeof(BiTNode));
 25         if (!(*T))
 26             exit(ERROR);
 27         (*T)->data = ch;
 28         printf("输入%c的左孩子结点,空格表示无此结点:", ch);
 29         CreateBiTree(&(*T)->lChild);
 30         printf("输入%c的右孩子结点,空格表示无此结点:", ch);
 31         CreateBiTree(&(*T)->rChlid);
 32     }
 33 
 34     return OK;
 35 }
 36 
 37 //先序遍历二叉树
 38 Status TraverseBiTree(BiTree T)
 39 {
 40     if (!T) return ERROR;
 41     printf("%c ", T->data);
 42     TraverseBiTree(T->lChild);
 43     TraverseBiTree(T->rChlid);
 44     return OK;
 45 }
 46 
 47 //中序遍历二叉树
 48 Status InOrderBiTree(BiTree T)
 49 {
 50     if (!T) return ERROR;
 51     InOrderBiTree(T->lChild);
 52     printf("%c ", T->data);
 53     InOrderBiTree(T->rChlid);
 54     return OK;
 55 }
 56 
 57 //后序遍历二叉树
 58 Status PostOrderBiTree(BiTree T)
 59 {
 60     if (NULL == T) return ERROR;
 61     PostOrderBiTree(T->lChild);
 62     PostOrderBiTree(T->rChlid);
 63     printf("%c ", T->data);
 64     return OK;
 65 }
 66 
 67 
 68 //二叉树的深度
 69 int TreeDeep(BiTree T)
 70 {
 71     int deep = 0;
 72     if (T)
 73     {
 74         int leftdeep = TreeDeep(T->lChild);
 75         int rightdeep = TreeDeep(T->rChlid);
 76         deep = leftdeep >= rightdeep ? leftdeep + 1 : rightdeep + 1;
 77     }
 78     return deep;
 79 }
 80 
 81 //二叉树叶子结点个数
 82 
 83 //主函数
 84 int main(void)
 85 {
 86     BiTree T;
 87     int str, num = 0;
 88     printf("输入第一个结点的值,空格表示没有叶结点:\n");
 89     CreateBiTree(&T);
 90     printf("先序遍历二叉树:\n");
 91     TraverseBiTree(T);
 92     printf("\n");
 93     printf("中序遍历二叉树:\n");
 94     InOrderBiTree(T);
 95     printf("\n");
 96     printf("后序遍历二叉树:\n");
 97     PostOrderBiTree(T);
 98     printf("\n");
 99     str = TreeDeep(T);
100     printf("树的深度为:%d", str);
101     printf("\n");
102     system("pause");
103     return 0;
104 }

 

数据结构 树

标签:

原文地址:http://www.cnblogs.com/cdoublej/p/5427277.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!