URAL 1136 Parliament 二叉树水题 BST后序遍历建树

本文介绍了一种利用二叉树后序遍历来构建树的方法,通过找到最后一个元素作为根节点,并根据其值划分左右子树,递归地构建整棵树。文章提供了完整的C++实现代码。

二叉树水题,特别是昨天刚做完二叉树用中序后序建树,现在来做这个很快的。

跟昨天那题差不多,BST后序遍历的特型,找到最后那个数就是根,向前找,比它小的那块就是他的左儿子,比它大的那块就是右儿子,然后递归儿子继续建树。


代码:


#include <cstdio>
#include <cstdlib>
const int maxn = 70000;

struct Node {
	int v;
	Node *l;
	Node *r;
};
int arr[maxn];
bool flag = false;

Node* addnode(int s, int e) {
	if (s > e)
		return NULL;
	Node* u = (Node*) malloc (sizeof(Node*));
	u->v = arr[e];
	if (s == e) {
		u->r = u->l = NULL;
		return u;
	}
	int i;
	for (i = e - 1; i >= s; i--)
		if (arr[i] < arr[e])
			break;
	u->l = addnode(s, i);
	u->r = addnode(i + 1, e - 1);
	return u;
}

void output(Node* u) {
	if (u->r != NULL)
		output(u->r);
	if (u->l != NULL)
		output(u->l);
	if (flag)
		printf(" ");
	flag = true;
	printf("%d", u->v);
}

int main() {
	int n;
	scanf("%d", &n);
	for (int i = 1; i <= n; i++)
		scanf("%d", &arr[i]);
	Node* root = addnode(1, n);
	output(root);
	printf("\n");
	return 0;
}
	




二叉搜索树(BST)是一种常见的数据结构,具有快速的查找、插入和删除操作。在C语言中实现其前序、中序和后序遍历可以按照以下方式进行。 首先,需要定义二叉搜索树的节点结构: ```c #include <stdio.h> #include <stdlib.h> // 定义二叉搜索树的节点结构 typedef struct TreeNode { int data; struct TreeNode *left; struct TreeNode *right; } TreeNode; ``` 前序遍历的顺序是:根节点 -> 左子树 -> 右子树。其递归实现代码如下: ```c // 前序遍历 void preOrder(TreeNode *root) { if (root != NULL) { printf("%d ", root->data); // 访问根节点 preOrder(root->left); // 递归遍历左子树 preOrder(root->right); // 递归遍历右子树 } } ``` 中序遍历的顺序是:左子树 -> 根节点 -> 右子树。常用于二叉搜索树排序,其递归实现代码如下: ```c // 中序遍历 void inOrder(TreeNode *root) { if (root != NULL) { inOrder(root->left); // 递归遍历左子树 printf("%d ", root->data); // 访问根节点 inOrder(root->right); // 递归遍历右子树 } } ``` 后序遍历的顺序是:左子树 -> 右子树 -> 根节点。其递归实现代码如下: ```c // 后序遍历 void postOrder(TreeNode *root) { if (root != NULL) { postOrder(root->left); // 递归遍历左子树 postOrder(root->right); // 递归遍历右子树 printf("%d ", root->data); // 访问根节点 } } ``` 以下是一个完整的示例,包含创建节点和测试遍历的代码: ```c #include <stdio.h> #include <stdlib.h> // 定义二叉搜索树的节点结构 typedef struct TreeNode { int data; struct TreeNode *left; struct TreeNode *right; } TreeNode; // 创建新节点 TreeNode* createNode(int data) { TreeNode* newNode = (TreeNode*)malloc(sizeof(TreeNode)); newNode->data = data; newNode->left = NULL; newNode->right = NULL; return newNode; } // 前序遍历 void preOrder(TreeNode *root) { if (root != NULL) { printf("%d ", root->data); preOrder(root->left); preOrder(root->right); } } // 中序遍历 void inOrder(TreeNode *root) { if (root != NULL) { inOrder(root->left); printf("%d ", root->data); inOrder(root->right); } } // 后序遍历 void postOrder(TreeNode *root) { if (root != NULL) { postOrder(root->left); postOrder(root->right); printf("%d ", root->data); } } int main() { // 构建一个简单的二叉搜索树 TreeNode *root = createNode(1); root->left = createNode(2); root->right = createNode(3); root->left->left = createNode(4); root->left->right = createNode(5); printf("前序遍历结果: "); preOrder(root); printf("\n"); printf("中序遍历结果: "); inOrder(root); printf("\n"); printf("后序遍历结果: "); postOrder(root); printf("\n"); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值