首页 > 编程语言 >FDS编程练习 · 其一

FDS编程练习 · 其一

时间:2024-03-26 23:01:43浏览次数:18  
标签:练习 int 编程 Tree buildTree FDS 遍历 right inorder

日常练手用,熟悉一下几种结构的代码实现。

1.通过给定中序遍历和后序遍历的数列重建二叉树

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

typedef struct Node *Tree;
struct Node
{
	int data;
	Tree left, right;
};
/*定义树*/

Tree buildTree (int inorder[], int postorder[], int n);
/*建树函数*/

void preorderTraversal (Tree theTree);
/*先序遍历函数(用于验证)*/

int main ()
{
	int n, i;
	scanf ("%d", &n);
	/*输入含 n 个数的数列*/
	
	int inorder[n], postorder[n];
	for (i = 0; i < n; i++)
		scanf ("%d", &inorder[i]);
	for (i = 0; i < n; i++)
		scanf ("%d", &postorder[i]);
	/*输入中序和后序数列*/
	
	Tree theTree = buildTree (inorder, postorder, n);
	/*建树*/
	
	preorderTraversal (theTree);
	/*遍历重建的树*/
	
	return 0; 
}

Tree buildTree (int inorder[], int postorder[], int n)
{
	Tree T = (Tree)malloc(sizeof (struct Node));
	T->data = postorder[n - 1];
	/*后序遍历的最后一个数即根结点数据*/
	
	if (n == 1)
	{
		T->left = NULL;
		T->right = NULL;
		return T;
	}
	/*若只剩一个数,则直接返回(别忘了令左右子树为 NULL )*/
	
	int i;
	for (i = 0; i < n; i++)
	{
		if (inorder[i] == postorder[n - 1])
			break;
	}
	if (i == 0)
	{
		T->left = NULL;
		T->right = buildTree (&inorder[1], postorder, n - 1);
	}
	/*中序遍历的第一个数是树的最左端,故该 T 无左子树,从中序遍历第二项开始继续建树*/
	
	else if (i == n-1)
	{
		T->right = NULL;
		T->left = buildTree (inorder, postorder, n - 1);
	}
	/*中序遍历的最后一个是树的最右端,故该 T 无右子树,再次遍历至倒数第二项为止*/
	
	else//此时 T 既有左子树又有右子树 
	{
		T->left = buildTree (inorder, postorder, i);
		/*用前 i 个数建左子树*/
		 
		T->right = buildTree (&inorder[i + 1], &postorder[i], n - 1 - i);
		/*用后 n-i 个数建右子树( n-1-i 即 n-(1+i) )*/ 
	}
	 
	return T;
} 

void preorderTraversal (Tree theTree)
{
	Tree T = theTree;
	if (T != NULL)
	{
		printf ("%d ", T->data);
		preorderTraversal (T->left);
		preorderTraversal (T->right);
	}
}

2.通过给定中序遍历和先序遍历的数列重建二叉树

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

typedef struct Node *Tree;
struct Node
{
	int data;
	Tree left, right;
};
/*定义树*/

Tree buildTree (int inorder[], int preorder[], int n);
/*建树函数*/

void postorderTraversal (Tree theTree);
/*后序遍历函数(用于验证)*/

int main ()
{
	int n, i;
	scanf ("%d", &n);
	/*输入含 n 个数的数列*/
	
	int inorder[n], preorder[n];
	for (i = 0; i < n; i++)
		scanf ("%d", &inorder[i]);
	for (i = 0; i < n; i++)
		scanf ("%d", &preorder[i]);
	/*输入中序和后序数列*/
	
	Tree theTree = buildTree (inorder, preorder, n);
	/*建树*/
	
	postorderTraversal (theTree);
	/*遍历重建的树*/
	
	return 0; 
}

Tree buildTree (int inorder[], int preorder[], int n)
{
	Tree T = (Tree)malloc(sizeof (struct Node));
	T->data = preorder[0];
	/*先序遍历的第一个数即根结点数据*/
	
	if (n == 1)
	{
		T->left = NULL;
		T->right = NULL;
		return T;
	}
	/*只剩一个数时直接返回*/
	
	int i;
	for (i = 0; i < n; i++)
	{
		if (inorder[i] == preorder[0])
			break;
	}
	if (i == 0)
	{
		T->left == NULL;
		T->right = buildTree (&inorder[1], &preorder[1], n - 1);
	}
	else if (i == n-1)
	{
		T->right = NULL;
		T->left = buildTree (inorder, &preorder[1], n - 1);
	} 
	else
	{
		T->left = buildTree (inorder, &preorder[1], i);
		T->right = buildTree (&inorder[i + 1], &preorder[i + 1], n - i - 1);
	} 
	/*原理类比上个代码*/
	 
	return T;
} 

void postorderTraversal (Tree theTree)
{
	Tree T = theTree;
	if (T != NULL)
	{
		postorderTraversal (T->left);
		postorderTraversal (T->right);
		printf ("%d ", T->data);
	}
}

标签:练习,int,编程,Tree,buildTree,FDS,遍历,right,inorder
From: https://blog.csdn.net/MrSkillless/article/details/137059889

相关文章

  • javascript基础代码练习
    一、输入新增病例数,累计确诊病例数,14天内聚集性疫情发生天数。新增或者累计确诊病例为0则该地区为低风险地区。新增大于0且累计确诊<50或者累计大于50且14天内聚集性疫情发生天数为0的地区为中风险地区。其他情况为高风险地区。<!DOCTYPEhtml><html><head>  <metachar......
  • 编程语言
    【三】编程语言【1】分类【2】机器语言计算机可以理解的语言可以操作计算机的系统硬件机器指令:通过控制高低电频变化组成指令去操作系统记住计算机全部指令及核心代码的含义厂家调控硬件设备时用0000代表load0001代表STORE...优点:执行效率高缺点:开发效率......
  • AOP切面试编程
    1.AOP基础1.1AOP概述什么是AOP?AOP英文全称:AspectOrientedProgramming(面向切面编程、面向方面编程),其实说白了,面向切面编程就是面向特定方法编程。AOP面向方法编程,可以做到在不改动这些原始方法的基础上,针对特定的方法进行功能的增强。AOP的作用:在程序运行期间在不......
  • MySQL小练习(1)
    --(1)查询全体学生的学号与姓名selectsno,snamefromstudent;--(2)查询全体学生的姓名、学号和所在系selectsname,sno,deptfromstudent;--(3)查询全体学生的详细记录select*fromstudent;--(4)查询全体学生的姓名及其出生年份selectsname,2024-sageas出生......
  • 牛客编程题
    提示:文章文章目录前言一、背景二、2.12.2总结前言前期疑问:本文目标:一、背景最近二、2.1坐标移动https://www.nowcoder.com/practice/119bcca3befb405fbe58abe9c532eb29?tpId=37&tqId=21240&rp=1&ru=/exam/oj/ta&qru=/exam/oj/ta&sourceUrl=%2Fexam%2Foj%2......
  • 蓝桥杯 试题 基础练习 十进制转十六进制 C++
    问题描述十六进制数是在程序设计时经常要使用到的一种整数的表示方式。它有0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F共16个符号,分别表示十进制数的0至15。十六进制的计数方法是满16进1,所以十进制数16在十六进制中是10,而十进制的17在十六进制中是11,以此类推,十进制的30在十六进制......
  • 【蓝桥杯省赛真题33】python单词排序 中小学青少年组蓝桥杯比赛 算法思维python编程省
     目录python单词排序一、题目要求1、编程实现2、输入输出二、算法分析三、程序编写四、程序说明五、运行结果六、考点分析七、 推荐资料1、蓝桥杯比赛2、考级资料3、其它资料python单词排序第十三届蓝桥杯青少年组python比赛省赛真题一、题目要求(注:input......
  • 使用 Amazon Bedrock + Claude 3 打造个性化智能编程助手
    最近,随着人工智能技术的迅速发展,代码助手已经成为软件开发领域备受关注的工具。像AmazonCodeWhisperer和GithubCopilot这样的工具可以在集成开发环境中帮助用户自动生成代码,极大地提高了开发效率。然而,这些助手通常缺乏直接执行代码的能力,需要额外集成开发环境来执行代码。......
  • 7 年的 web 编程生涯,今天系统整理学习web 安全学习笔记
    背景说来惭愧,7年的web编程生涯,一直没有真正系统的学习web安全知识(认证和授权除外),这个月看了一本《Web安全设计之道》,书中的内容多是从微软官方文档翻译而来,这本书的含金量不高,不过也不能说没有收获,本文简单记录一下我学习Web安全方面的笔记。本文不涉及IIS、Wind......
  • 编程语言|C语言——C语言标识符的命名规则
    1.标识符简介在计算机高级语言中,用来对变量、符号常量名、函数、数组、类型等命名的有效字符序列统称为标识符。标识符可以简单认为是一个名字,用来标识变量名、常量名、函数名及数组等。变量名a、b、c,符号常量名PI、Pai,函数名printf、scanf等都是标识符。2.标识符命名规......