首页 > 其他分享 >洛谷P1305 新二叉树(c嘎嘎)

洛谷P1305 新二叉树(c嘎嘎)

时间:2024-12-06 21:31:29浏览次数:5  
标签:h1 洛谷 递归 右子 dfs P1305 lt 二叉树 节点

题目链接P1305 新二叉树 - 洛谷 | 计算机科学教育新生态

题目难度:普及

刷题心得:做了几道这种类型的题都不用建树就可以解决,基本上还是利用好树的结构,例如这道题求前序序列(根左右)是可以用递归来求的。无非就是先从根出发,递归遍历左子树,递归遍历右子树,遇到  * 直接返回就行了。

下面奉上代码部分:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
//const int N = 1e6 + 10;
char h,h1; //定义两个是为了将根节点做完参数直接传入函数 
int n;

struct node
{
	char leftNode,rightNode;//存左右子树的节点 
}lt[130];// ASCII 范围是足够的

void dfs(char x)//递归求前序遍历 
{
	if(x == '*' ) return; 如果是空节点,返回
	cout<<x;//输出 
	dfs(lt[x].leftNode);//递归遍历左子树 
	dfs(lt[x].rightNode);//递归遍历右子树 
}
int main() {
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    
    cin >> n;
    
    cin >> h1;
    cin >> lt[h1].leftNode >> lt[h1].rightNode;
    
    for(int i=2; i<=n; i++)
    {
    	cin >> h;
    	cin >> lt[h].leftNode;
    	cin >> lt[h].rightNode;
	}
    dfs(h1);
    
    return 0;
}

  下面讲讲递归是如何执行的(个人理解)  

1. 初始调用:dfs(a)
  • 当前节点 a
  • 输出 a
  • 递归访问左子树:dfs(b)
2. 递归调用:dfs(b)
  • 当前节点 b
  • 输出 b
  • 递归访问左子树:dfs(d)
3. 递归调用:dfs(d)
  • 当前节点 d
  • 输出 d
  • d 没有左右子树,所以返回。
4. 回到 b,继续递归访问右子树:dfs(i)
  • 当前节点 i
  • 输出 i
  • i 没有左右子树,所以返回。
5. 回到 a,继续递归访问右子树:dfs(c)
  • 当前节点 c
  • 输出 c
  • 递归访问左子树:dfs(j)
6. 递归调用:dfs(j)
  • 当前节点 j
  • 输出 j
  • j 没有左右子树,所以返回。
7. 返回到 c,继续递归访问右子树:dfs(*)
  • 右子树是空的,所以直接返回。
8. 完成所有递归,结束遍历。

输出:

最终的输出是前序遍历的结果:

abdcij

标签:h1,洛谷,递归,右子,dfs,P1305,lt,二叉树,节点
From: https://blog.csdn.net/2302_79431881/article/details/144244052

相关文章

  • 洛谷解题日记14||前缀和,差分与离散化
    #include<iostream>#include<vector>#include<algorithm>usingnamespacestd;intmain(){intn;cin>>n;//读取区间的个数nvector<pair<int,int>>intervals(n);//存储区间的起点和终点,使用pair类型//读......
  • 洛谷题单指南-线段树-P1637 三元上升子序列
    原题链接:https://www.luogu.com.cn/problem/P1637题意解读:统计序列a[1]~a[n]中三元上升子序列的个数,三元上升子序列是指对于1<=i<j<k<=n有a[i]<a[j]<a[k],(a[i],a[j],a[k])成为一组上升子序列。解题思路:1、先思考一下暴力,通过三重循环枚举i,j,k找到所有i<j<k时符合a[i]<a[j]<a[k]......
  • 洛谷 P11362 [NOIP 2024] 遗失的赋值
    题目传送门如果没有其他限制,那么一个二元限制可能出现的方案数为\(v^2\)。考虑\(\{x_n\}\)的一个区间,设其中能放\(t\)个二元限制,它的左右端点有一元限制,求这\(t\)个限制的方案数。设这个数为\(f(t)\)。如果第一个二元限制的\(a\)与左端点\(i\)处的\(x\)值相同,那......
  • 洛谷 P1651 塔(DP)
    题目传送门https://www.luogu.com.cn/problem/P1651解题思路设  表示前  个积木,两塔高度差为 (第一个比第二个高多少),的最大高度。易得:首先,不选当前的积木:其次,选当前积木,将它拼到第一个塔上:最后,选当前积木,将它拼到第二个塔上:由于,第二维可能为负数,所以,我们可以以 (数......
  • 二叉树遍历
    [Algo]二叉树遍历二叉树节点类型定义:structBinaryTreeNode{intval;BinaryTreeNode*left;BinaryTreeNode*right;BinaryTreeNode(intx):val(x),left(nullptr),right(nullptr){}};1.前序遍历//1.非递归前序遍历二叉树//(1)弹出栈顶(2)......
  • 关于二叉树的先/中/后序的非递归遍历
    力扣上有原题~中 先后前言先前跟着acwing学习算法基础课,自以为已经掌握了基础的算法和数据结构,剩下就差做题了,结果之后在力扣和洛谷上看到有关二叉树的题目,完全不知道是怎么一回事,故开始二叉树的学习(果然学习数据结构基础不能光看课)正文本片文章主要讲述二叉树的先中后......
  • GESP一级必刷题 分支结构 P5713 洛谷团队系统
    【深基3.例5】洛谷团队系统题目描述在洛谷上使用团队系统非常方便的添加自己的题目。如果在自己的电脑上配置题目和测试数据,每题需要花费时间555分钟;而在洛谷团队中上......
  • 算法之旅:二叉树的删除、验证与插入(98,700,701,450)
    ......
  • 洛谷题单指南-线段树-P6492 [COCI2010-2011#6] STEP
    原题链接:https://www.luogu.com.cn/problem/P6492题意解读:一个序列,初始L,可以指定一个位置修改,L修改成R,R修改成L,可以令L=0,R=1,然后每次修改后输出序列最长不连续0、1(0/1交替出现)的长度。解题思路:序列支持单点修改(0->1,1->0),区间查询(最长不连续0、1长度),因此可以采用线段树,不需要懒标......
  • LeetCode102 二叉树的层序遍历
    LeetCode102二叉树的层序遍历题目链接:LeetCode102描述给你二叉树的根节点root,返回其节点值的层序遍历。(即逐层地,从左到右访问所有节点)。示例输入:root=[3,9,20,null,null,15,7]输出:[[3],[9,20],[15,7]]思路方法一:迭代方式--借助队列方法二:递归方式代码方法......