树的定义、存储及程序实现

树的定义:

1.有且只有一个称为根的节点。

2.有若干不相交的子树,这些子树本身也是树。

深度:从根节点到最底层节点的层数。

树的分类:

一般树:任意一个节点的子节点的个数不受限制。

二叉树:任意一个节点的子节点的个数最多不超过两个。

满二叉树:除了叶子节点,每个节点的子节点的个数都是二。

完全二叉树:如果删除了满二叉树最底层最右边的若干节点,则这样形成的二叉树称为完全二叉树。

树的存储:

二叉树的存储:

链式存储;

连续存储(如完全二叉树的存储)

一般树的存储:

双亲表示法;

孩子表示法;

双亲孩子表示法;

二叉树表示法:把一个普通树转化为二叉树来存储(这是常用的方法)。

具体转化方法:把节点的左指针指向孩子,右指针指向它的兄弟,只要满足该条件即可把普通树转化为二叉树。

二叉树的操作:

先序遍历:

1.先访问根节点;

2.再先序遍历左子树;

3.再先序遍历右子树;

先序遍历示意图:

中序遍历:

1.先中序遍历左子树;

2.再访问根节点;

3.再中序遍历右子树;

中序遍历示意图:

后序遍历:

1.先后序遍历左子树;

2.再后序遍历右子树;

3.再访问根节点;

后序遍历示意图:

二叉树的操作总共有这三种方法,先序、中序、后序。其实指的是对左子树、右子树、根节点这三种节点访问时,对根节点访问的先后顺序。

已知单独的任一种都不能推出原始二叉树,必须已知先序遍历和中序遍历或者已知中序遍历和后序遍历可推出原始二叉树,但是若已知先序遍历和后序遍历则不能推出原始二叉树。

已知先序和中序推出原始二叉树:

已知中序和后序推出原始二叉树:


推出的二叉树都是一样的哈...

在由中序和后序推断的时候HG的地方出错,下次应当注意...

具体程序实现,在这里采用的是二叉树的静态存储,相对来说比较简单,只做演示及熟悉二叉树存储的实现。


main函数实现:

  1 #include <stdio.h>
  2 #include <malloc.h>
  3 typedef struct Node
  4 {
  5     char data;
  6     struct Node *pLchild;
  7     struct Node *pRchild;
  8 }*pNode;
  9 pNode CreatNode();
 10 void PreTraversal( pNode pNewNode );
 11 void InTraversal( pNode pNewNode );
 12 void PostTraversal( pNode pNewNode );
 13 int main()
 14 {
 15     pNode pNewNode = CreatNode();
 16     printf( "Preorder traversal...\n" );
 17     PreTraversal( pNewNode );
 18     printf( "Inoder traversal...\n" );
 19     InTraversal( pNewNode );
 20     printf( "Postorder traversal...\n" );
 21     PostTraversal( pNewNode );
 22     return 0;
 23 }

二叉树创建:

 24 pNode CreatNode()
 25 {
 26     pNode pA = ( pNode ) malloc( sizeof( struct Node ));
 27     pNode pB = ( pNode ) malloc( sizeof( struct Node ));
 28     pNode pC = ( pNode ) malloc( sizeof( struct Node ));
 29     pNode pD = ( pNode ) malloc( sizeof( struct Node ));
 30     pNode pE = ( pNode ) malloc( sizeof( struct Node ));
 31     pNode pF = ( pNode ) malloc( sizeof( struct Node ));
 32     pA->data = 'A';
 33     pB->data = 'B';
 34     pC->data = 'C';
 35     pD->data = 'D';
 36     pE->data = 'E';
 37     pF->data = 'F';
 38     pA->pLchild = pB;
 39     pB->pLchild = pB->pRchild = NULL;
 40     pA->pRchild = pC;
 41     pC->pLchild = pD;
 42     pD->pLchild = pD->pRchild = NULL;
 43     pC->pRchild = pE;
 44     pE->pLchild = pF;
 45     pE->pRchild = NULL;
 46     pF->pLchild =pF->pRchild = NULL;
 47     return pA;
 48 }

先序遍历二叉树:

 49 void PreTraversal( pNode pNewNode )
 50 {
 51     if( pNewNode != NULL )
 52     {
 53         printf( "%c\n", pNewNode->data );
 54     }
 55     if( pNewNode != NULL )
 56     {
 57         PreTraversal( pNewNode->pLchild );
 58     }
 59     if( pNewNode != NULL )
 60     {
 61         PreTraversal( pNewNode->pRchild );
 62     }
 63 }
中序遍历二叉树:

 65 void InTraversal( pNode pNewNode )
 66 {
 67     if( pNewNode != NULL )
 68     {
 69         InTraversal( pNewNode->pLchild );
 70     }
 71     if( pNewNode != NULL )
 72     {
 73         printf( "%c\n", pNewNode->data );
 74     }
 75     if( pNewNode != NULL )
 76     {
 77         InTraversal( pNewNode->pRchild );
 78     }
 79 }
后序遍历二叉树:

 81 void PostTraversal( pNode pNewNode )
 82 {
 83     if( pNewNode != NULL )
 84     {
 85         PostTraversal( pNewNode->pLchild );
 86     }
 87     if( pNewNode != NULL )
 88     {
 89         PostTraversal( pNewNode->pRchild );
 90     }
 91     if( pNewNode != NULL )
 92     {
 93         printf( "%c\n", pNewNode->data );
 94     }
 95 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值