数据结构我好爱:08二叉树创建与遍历

二叉树是数据结构里的好东西!!!

树与队列可以达到逐层处理的效果!

此处是非递归的形式来创建二叉树,因此借助了循环队列来辅助。

这样的创建就是一层一层的创建区别于递归创建。

结构体:

        队列储存的是nodePtr的指针

typedef struct node {
	char data;
	struct node* left;
	struct node* right;
}Node,*NodePtr;

typedef struct {
	int front;
	int rear;
	NodePtr* nodesPtr;//二级指针
}Que,*QuePtr;

创建节点:pass

NodePtr constructNode(char data) {
	NodePtr new_Node = (NodePtr)malloc(sizeof(Node));
	new_Node->data = data;
	new_Node->left = NULL;
	new_Node->right = NULL;
	return new_Node;
}

主体函数:初始化队列后,先放入根节点,然后进入while判断,为双向结点创建左右孩子;再分别将左右孩子放入队列,因为有可能左右孩子还可以是别人的双亲。这就是借助队列创建是逐层创建的原因。

NodePtr TobeTree(char* s) {
	int i;
	char tempC;
	i = 0;
	tempC = s[i];
	QuePtr CQ = Init();
	NodePtr root = constructNode(tempC);
	enque(CQ, root);
	while (!isEmpty(CQ)) {
		NodePtr parent = deque(CQ);
		i++;
		tempC = s[i];
		if (tempC != '#') {
			NodePtr chirld_l = constructNode(tempC);
			printf("%d ", chirld_l->data);
			enque(CQ, chirld_l);
			parent->left = chirld_l;
		}

		i++;
		tempC = s[i];
		if (tempC != '#') {
			NodePtr chirld_r = constructNode(tempC);
			enque(CQ, chirld_r);
			parent->right = chirld_r;
		}
	}
	return root;
}

 递归遍历:(前序,中序,后序)递归罢了,前,中,后的遍历方式只是位置不一样!

void preOder(NodePtr root) {
	if (root == NULL) return;
	printf("%c ", root->data);
	preOder(root->left);
	preOder(root->right);
}

层序遍历:继续借助队列,思路也比较简单,把根节点放入,在出队的时候将它的左右孩子放入,也能达到逐层遍历的效果。

void level(QuePtr CQ, NodePtr root) {
	enque(CQ, root);
	while (!isEmpty(CQ)) {
		NodePtr out = deque(CQ);
		printf("%d ", out->data);
		if (out->left != NULL) {
			enque(CQ, out->left);
		}
		if (out->right != NULL) {
			enque(CQ, out->right);
		}
	}
}

 

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值