二叉树遍历方法,前根、中根和后根

#include<stdio.h>
#include<stdlib.h>
typedef struct tree {
	int data;
	struct tree* left;
	struct tree* right;
}Btree,*Link_tree;
Link_tree Nnode(int data) {
	Link_tree nnode = (Link_tree)malloc(sizeof(Btree));
	if (!nnode) {
		printf("申请空间失败无法储存数据!\n");
		return NULL;
	}
	nnode->data = data;
	nnode->left = NULL;
	nnode->right = NULL;
	return nnode;
}
//二叉树的创立
Link_tree create_btree(Link_tree root, int data) {
	if (root == NULL) {
		return Nnode(data);
	}
	else {
		if (root->data > data) {
			root->left = create_btree(root->left,data);
		}
		else {
			root->right = create_btree(root->right,data);
		}
		return root;
	}
}
void pre_traverse(Link_tree ptr) {
	if (ptr) {
		printf("%d ",ptr->data);
		pre_traverse(ptr->left);
		pre_traverse(ptr->right);
	}
}
void mid_traverse(Link_tree ptr) {
	if (ptr) {
		mid_traverse(ptr->left);
		printf("%d ", ptr->data);
		mid_traverse(ptr->right);
	}
}
void post_traverse(Link_tree ptr) {
	if (ptr) {
		post_traverse(ptr->left);
		post_traverse(ptr->right);
		printf("%d ", ptr->data);
	}
}
Link_tree search(Link_tree ptr,int value) {
	while (ptr) {
		if (ptr->data == value) {
			return ptr;
		}
		else if(ptr->data > value){
			ptr = ptr->left;
		}
		else {
			ptr = ptr->right;
		}
	}
	return ptr;
}
int main() {
	int data[] = {5,6,24,8,12,3,17,1,9};
	Link_tree root = NULL;
	int i = 0;
	for (i = 0; i < sizeof(data) / sizeof(int);i++) {
		root = create_btree(root,data[i]);
	}
	//前序遍历
	printf("前序遍历\n");
	pre_traverse(root);
	printf("\n");
	//中序遍历
	printf("中序遍历\n");
	mid_traverse(root);
	printf("\n");
	//后序遍历
	printf("后序遍历\n");
	post_traverse(root);
	//节点查找
	int value = 0;
	printf("\n");
	scanf_s("%d",&value,sizeof(int));
	Link_tree ptr = search(root,value);
	if (ptr) {
		printf("\n找到了[%2d]", value);
	}
	else {
		printf("\n没找到[%2d]",value);
	}
	//二叉树节点的插入,可以直接调用初始化函数,如果
	//为了确保数据不重复那么先进行查找,在没查找到的
	//情况下再插入
	/*
	节点的删除操作
	1.叶节点,则指向叶节点的标签置空
	2.若非根叶结点操作与单向链表删除
	中间节点类似,
	3,若删除根节点,左子树不变,右子
	树根节点在左子树中重新寻找位置插入
	*/
	return 0;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值