栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

数据结构我好爱: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);
		}
	}
}

 

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/928086.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号