树与二叉树的概念及遍历查找(C语言实现)(2019.11.12)

一、树的定义及特点

Define:  树是n(n>0)个节点的有限集T,其中:有且仅有有一个特定的节点,称为树的根(root)。

当n>1时,其余节点可以分为m(m>0)个互不相交的有限集T1,T2,T3,....Tm,其中每个集合本身又是一棵树,称为跟的子树(SubTree)。

Feature:  a、树中至少有一个节点-----根。 b、树中各子树是互不相交的集合。

 

二、树的基本专业术语

节点(node)----------------表示树中的元素,包括数据项及若干指向子树的分支。

节点的度(degree)-------节点拥有的子树数。

叶子(leaf)------------------度为0的节点。

孩子(child)-----------------节点子树的根称为该节点的孩子。

双亲(parents)-------------孩子节点的上层节点。

兄弟(sibling)---------------同一双亲的孩子。

树的度---------------------------一棵树中最大的节点度树。

节点的层次(level)---------从根节点算层,根为第一层,它的孩子为第二层..........

深度(depth)-----------------树中节点的最大层次树数。

有序树和无序树----------------子树从左至右有次序之分则为有序,否则为无序树。

森林(forest)------------------m棵互不相交的树的集合。

如下图结构:

 

三、二叉树的定义及特点

 Define:  二叉树是n(n>0)个节点有限集,它或为空树(n=0), 或由一个根节点和两棵分别称为左子树和右子树的互不相交的二叉树形成。

Feature: 每个节点至多有两棵子树(即不存在度大于2的节点),二叉树的子树有左、右之分,且其次序不能任意颠倒。

基本形态:空二叉树;只有根节点的二叉树;右子树为空;左子树为空;左右子树不为空。

 

四、线性结构与树形结构的对比

线性结构                                                                            树形结构

第一个数据元素(无前驱)                                               根节点(无前驱)                                                                           

最后一个数据元素(无后继)                                            多个叶子节点(无后继)     

其它数据元素(一个前驱,一个后继)                              其它数据元素(一个前驱,一个后继)                                         

 

五、二叉树的遍历(C语言实现)

二叉树的排序方式有前序、中序、后序,定义如下图:

 

C语言实现:

说明: 定义一个二叉树如下:包含四个节点,n1,n2,n3,n4

遍历结果:

前序:根-左-右   3 7 2 9

中序:左-根-右   2 7 3 9

后序:左-右-根   2 7 9 3

 

代码:

#include <stdio.h> 
#include <stdlib.h>

/*Define node structure*/
typedef struct node{
	int data;
	struct node* left; 
	struct node* right;
}Node;

/*binary tree of traversing*/
//pre order
void preorder( Node* node){
	if( node != NULL){
		printf("%d\n",node -> data);
		preorder( node -> left);//recursion 
		preorder( node -> right);
	}	
}

//in order
void inorder( Node* node ){
	if( node != NULL){
		inorder( node -> left);
		printf("%d\n",node -> data);
		inorder( node -> right);
	}	
}

//post order
void postorder( Node* node){
	if( node != NULL){
		postorder( node -> left);
		postorder( node -> right);
		printf("%d\n",node -> data);
	}
}
int main(){
	/*Create node*/
	Node n1;
	Node n2;
	Node n3;
	Node n4;
	
	/*Write data*/
	n1.data = 3;
	n2.data = 7;
	n3.data = 9;
	n4.data = 2;
	
	/*Connect different node*/
	n1.left = &n2;
	n1.right = &n3;
	n2.left = &n4;
	n2.right = NULL;
	n3.left = NULL;
	n3.right = NULL;
	n4.left = NULL;
	n4.right = NULL;
	
	/*printf*/
    printf("pre order:\n");
    preorder(&n1);

    printf("in order:\n");
    inorder(&n1);

    printf("post order:\n");	
    postorder(&n1);
	
	return 0;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值