首页 > 其他分享 >推断二叉树(进阶)

推断二叉树(进阶)

时间:2024-10-18 17:43:59浏览次数:6  
标签:tmp 遍历 进阶 int lson 二叉树 推断 节点

Description

给出一棵二叉树的中序遍历和每个节点的父节点,求这棵二叉树的先序和后 序遍历。

Input

输入第一行为一个正整数 n 表示二叉树的节点数目, 节点编号从 1 到 n,其中 1 为根节点。
第 2 行有 n 个数字, 第 i 个数字表示 i 的父亲节点。( 1 的父亲节点为 0, 表示无)
第 3 行为中序遍历。
30%的数据: n<=20;
60%的数据: n<=1000;
100%的数据: n<=10000;

Output

输出 2 行, 第一行为先序遍历,第二行为后序遍历。

Sample Input

10
0 7 2 2 9 1 8 1 6 8
9 5 6 1 10 8 7 3 2 4

Sample Output

1 6 9 5 8 10 7 2 3 4
5 9 6 10 3 4 2 7 8 1

思路

存下每个节点的左右儿子,然后根据中序遍历判断谁是左儿子,谁是右儿子,建完树,跑一下先序遍历和后序遍历

#include<iostream>
using namespace std;
const int N = 10010;
int lson[N], rson[N];//存结点x的左右儿子
int last[N];

void PreOrder(int x)
{
	//题目给定1为根
	if (x != 1) cout << " ";
	cout << x;
	if (lson[x]) PreOrder(lson[x]);
	if (rson[x])PreOrder(rson[x]);
}

bool flag = true;
void PostOrder(int x)
{
	if (lson[x]) PostOrder(lson[x]);
	if (rson[x])PostOrder(rson[x]);
	if (flag) cout << x;
	else cout<<" " << x;

	flag = false;
}


int main() {
	int n;
	cin >> n;
	int tmp;
	//先默认存左,左存了就存右
	for (int i = 1; i <= n; i++)
	{	
		cin >> tmp;
		if (!tmp)continue;
		if (!lson[tmp]) lson[tmp] = i;
		else rson[tmp] = i;
	}

	//last存tmp出现的先后,i表示先后
	for (int i = 1; i <= n; i++)
	{
		cin >> tmp;
		last[tmp] = i;
	}

	for (int i = 1; i <= n; i++)
	{
		if (lson[i] && rson[i])
		{
			//左根右
			if (last[rson[i]] < last[lson[i]])
			{
				swap(lson[i], rson[i]);
			}
		}
		//左根右 如果rson[i](只是个值)在根前, 那就是右儿子
		else if (!lson[i] && rson[i])
		{
			if (last[rson[i]] < last[i])
			{
				lson[i] = rson[i];
				rson[i] = 0;
			}
		}
		else if (lson[i] && !rson[i])
		{
			if (last[lson[i]] > last[i])
			{
				rson[i] = lson[i];
				lson[i] = 0;
			}
		}
	}

	PreOrder(1); cout << endl;
	PostOrder(1); cout << endl;

}

标签:tmp,遍历,进阶,int,lson,二叉树,推断,节点
From: https://www.cnblogs.com/szz123/p/18474764

相关文章

  • B+树、红黑树、平衡二叉树
    1.概述这三种数据结构都用于解决动态查找问题,即能够在插入、删除的同时保持高效的查找性能。它们广泛应用于数据库、文件系统、内存管理等领域。但它们的具体结构和应用场景有所不同。B+树(B+Tree):B+树是一种自平衡的多叉树,常用于数据库系统和文件系统中。它的特点是所有......
  • 解锁二叉树的魅力:链式实现详解
    前言二叉树的简介及顺序实现引言在数据结构的浩瀚星空中,二叉树如同一颗璀璨的明珠,其优雅的结构和强大的功能使其成为计算机科学中不可或缺的工具。从数据库索引到编译器的语法树,二叉树以其独特的方式支撑着许多核心算法与数据处理。本文将深入探讨如何使用C语言实现二叉树的......
  • 2024年网络安全进阶手册:黑客技术自学路线
    ......
  • 卡尔曼讲解与各种典型进阶MATLAB编程(专栏目录,持续更新……)
    专栏链接:https://blog.csdn.net/callmeup/category_12574912.html文章目录专栏介绍重点文章卡尔曼滤波的原理卡尔曼滤波的例程进阶MATLAB编程后续更新专栏介绍本专栏旨在深入探讨卡尔曼滤波及其在各类应用中的实现,尤其是通过MATLAB编程进行的典型案例分析。卡尔曼......
  • 昇思MindSpore进阶教程--故障恢复
    大家好,我是刘明,明志科技创始人,华为昇思MindSpore布道师。技术上主攻前端开发、鸿蒙开发和AI算法研究。努力为大家带来持续的技术分享,如果你也喜欢我的文章,就点个关注吧概述模型训练过程中,可能会遇到故障。重新启动训练,各种资源的开销是巨大的。为此MindSpore提供了故障......
  • 111. 二叉树的最小深度【二叉树】
    文章目录111.二叉树的最小深度解题思路111.二叉树的最小深度111.二叉树的最小深度给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。说明:叶子节点是指没有子节点的节点。示例1:输入:root=[3,9,20,null,null,15,7]......
  • 二叉树的中序遍历
    给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。示例1:输入:root=[1,null,2,3]输出:[1,3,2]示例2:输入:root=[]输出:[]示例3:输入:root=[1]输出:[1]提示:树中节点数目在范围 [0,100] 内-100<=Node.val<=100进阶: 递归算法很简单,你可以通......
  • 109. 有序链表转换二叉搜索树【二叉树】
    文章目录109.有序链表转换二叉搜索树解题思路Go代码109.有序链表转换二叉搜索树109.有序链表转换二叉搜索树给定一个单链表的头节点head,其中的元素按升序排序,将其转换为平衡二叉搜索树。平衡二叉树是指该树所有节点的左右子树的深度相差不超过1。示例......
  • 七、二叉树之链式结构(递归)
    一、前序:前面章节所说二叉树的结构其实是递归的,为什么这样说呢?根节点有左右子树,根节点的左右孩子又有左右子树,以此类推,直到叶子节点,它的左右子树为NULL,开始返回。所以,我们把它分成一个又一个的子树来分析。因此,它的结构是递归的。因为一开始接触二叉树,还不是熟悉,我们先来手动......
  • Winform控件基础与进阶----DataGridView
    Winform控件基础之封装一个通用的DataGridView操作类1、创建Winform项目2、创建公共控件操作文件夹3、主界面1、控件布局2、提取通用方法3、静态方法类实现4、其他工具类实现1、JsonHelper工具类实现2、TxtOperateHelper工具类实现5、数据模型实现1、创建表结构模型2......