初夏小谈:前序构造二叉树及三种遍历(完整版)

通过前序来构造出一棵二叉树,创建一颗二叉树,可以先创建根节点,后再创建它的左孩子和右孩子。遇到空就停止。对于每个结点都是先创建它的左孩子,之后再创建它的右孩子。

但是在创建左孩子和右孩子是,最大的问题就是,待创建数据要移动相应的位。每消耗一个数据就要取下一个元素。可以通过一个变量来计数移动的个数。此外要将每个根节点的左右孩子接起来。因此也要记录每个根节点来连接它的左右孩子。并且进行三种遍历。

代码如下:

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

typedef struct Node
{
	char data;
	struct Node* Left;
	struct Node* Right;
}Node;

typedef struct StuctNode
{
	Node* ptr;
	int count;
}StructNode;

//前序遍历构造二叉树
StructNode CreatBinaryTree(char arr[], int size);

//1.前序遍历
void PreorderTraversal(Node* ptr);

//2.中序遍历
void InorderTraversal(Node* ptr);

//3.后序遍历
void PostorderTraversal(Node* ptr);
#include"BinaryTree.h"

//1.前序遍历
void PreorderTraversal(Node* ptr)
{
	if (ptr == NULL)
	{
		return;
	}
	printf("%c ", ptr->data);
	PreorderTraversal(ptr->Left);
	PreorderTraversal(ptr->Right);
}

//2.中序遍历
void InorderTraversal(Node* ptr)
{
	if (ptr == NULL)
	{
		return;
	}
	InorderTraversal(ptr->Left);
	printf("%c ", ptr->data);
	InorderTraversal(ptr->Right);
}

//3.后序遍历
void PostorderTraversal(Node* ptr)
{
	if (ptr == NULL)
	{
		return;
	}
	PostorderTraversal(ptr->Left);
	PostorderTraversal(ptr->Right);
	printf("%c ", ptr->data);
}

//前序遍历构造二叉树
//A B C # # E F # G
StructNode CreatBinaryTree(char arr[], int size)
{
	if (size == 0)
	{
		StructNode result =
		{
			.ptr = NULL,
			.count = 0
		};
		return result;
	}
	char data = arr[0];
	if (arr[0] == '#')
	{
		StructNode result =
		{
			.ptr = NULL,
			.count = 1
		};
		return result;
	}

	//创建根结点
	Node* ptr = (Node*)malloc(sizeof(Node));
	ptr->data = data;

	//创建左子树
	StructNode LeftNode = CreatBinaryTree(arr + 1, size-1);
	ptr->Left = LeftNode.ptr;

	//创建右子树
	StructNode RightNode = CreatBinaryTree(arr + 1 + LeftNode.count, size - 1 - LeftNode.count);
	ptr->Right = RightNode.ptr;

	StructNode result =
	{
		.ptr = ptr,
		.count = 1 + LeftNode.count + RightNode.count
	};
	return result;
}
#include"BinaryTree.h"

int main()
{
	char* p = "ABD##E##C#F";
	int size = strlen(p);
	StructNode result = CreatBinaryTree(p, size);

	//前序遍历:
	printf("前序遍历:");
	PreorderTraversal(result.ptr);
	printf("\n");

	//中序遍历:
	printf("中序遍历:");
	InorderTraversal(result.ptr);
	printf("\n");

	//前序遍历:
	printf("前序遍历:");
	PostorderTraversal(result.ptr);
	printf("\n");

	system("pause");
	return 0;
}

结果显示:

该棵二叉树就是上一篇,二叉树的三种遍历的二叉树。

此次小结:

其中构造二叉树的结果需要用结构体来返回两个结果。应当注意。

在创建的过程中我对创建左子树后。把size--导致size被多次移动,出现了堆栈溢出的错误。走了不少弯路。但堆栈溢出也是极有可能发生的,因为栈区在内存中极其小一般默认1M。但可以一定程度上人为设置它的栈大小。更好的办法就是创建一块栈区。

                                                                                                                                                                   珍&源码

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值