数据结构之二叉树--C语言

二叉树是一种依托指针建立的数据结构。二叉树结构体中包含数据域和两个指针,一个指向左树,一个指向右树。开始的第一个结点称为二叉树的根节点,需要创建一个指向根节点的指针,这样才能访问整棵二叉树。

我所知的有两种建立方式。第一种是设个函数的返回类型为二叉树结点结构体。例如:

typedef struct TreeNode{

 char data;
struct TreeNode *left;
struct TreeNode *right;

}TreeNode,*PTreeNode;

PTreeNode create(PTreeNode node){

.........

}

主函数中写入:main (){

 PTreeNode root;

 root=create(root);

第二种方法是在create函数中传入(PTreeNode )&node。直接修改地址中的值

void create((PTreeNode)&node){

}

这样处理之后,就能够对二叉树进行操作了。

代码::

typedef struct BTreeNode{
 int data;
 struct BTreeNode *left;//左树
 struct BTreeNode *right;//右树
}BTreeNode,*PBTreeNode;

二叉树的建立:

void createTree(PBTreeNode &node){//建立树 
	int c;
	scanf("%d",&c);
	if(c==0)
		
		{
		node=NULL;
		//printf("当前所处第%d结点处\n");
		} 
	else
	{
		node=(BTreeNode *)malloc(sizeof(BTreeNode));	
		node->data=c;
		createTree(node->left);
		createTree(node->right);
}
}


二叉树的先序遍历:

void ergodic_first(PBTreeNode node){//遍历结点 
	if(node!=0)
		{	
			printf("结点数据=%d\n",node->data);
			ergodic_first(node->left);
			//printf("右树结点数据=%d\n",node->data);
			ergodic_first(node->right);
		}
}


二叉树的中序遍历:

void ergodic_middle(PBTreeNode node){
	if(node!=0){
		ergodic_middle(node->left);
		printf("结点数据=%d\n",node->data);
		ergodic_middle(node->right);
	}
}


二叉树的后序遍历:

void ergodic_behind(PBTreeNode node){
	if(node!=0){
		ergodic_behind(node->left);
		ergodic_behind(node->right);
		printf("结点数据=%d\n",node->data);
	}
}


求二叉树的深度:

int TreeDeepth(PBTreeNode node){
	if(node==0)
		return 0;
	int nleft=TreeDeepth(node->left);
	printf("迭代第%d次\n",nleft);
	int nright=TreeDeepth(node->right);	
	printf("迭代第%d次\n",nright);
		return nleft>nright?nleft+1:nright+1;
}


主函数:

int main(){
	BTreeNode *root;
	//init(&node);
	//建树
	createTree(root);
	printf("二叉树建立完成\n");
	printf("先序遍历\n"); 
	ergodic_first(root);
	printf("中序遍历\n");
	ergodic_middle(root);
	printf("后序遍历\n");
	ergodic_behind(root);
	printf("遍历完成\n");
	deep=TreeDeepth(root);
	printf("树的深度为:%d\n",deep);
	return 0;
} 

可以发现二叉树的创建、遍历、求深度都使用到了递归。这是由二叉树的结构决定的。

对比链表,可以发现链表也使用了指针访问下一个结点。可见链表也可以采用递归的算法完成创建、遍历、求长、删除等功能。如,建立一个单链表。

typedef struct LinkNode{

 int data;
struct LinkNode *next;

}LinkNode;

void createLink(LinkNode *node){

 int d;scanf("%d",&d);

 if(d!=0)

 {

node=(LinkNode *)malloc(sizeof(LinkNode));

node->data=d;

createLink(node->next);

}

else

 node=NULL;

}

但是,这种方式明显占用很多的内存。


posted @ 2020-01-14 19:35  秋风不识春  阅读(428)  评论(0编辑  收藏  举报