首页 > 其他分享 >科丁乐K12137 二叉树中的秘密

科丁乐K12137 二叉树中的秘密

时间:2024-12-14 11:59:21浏览次数:6  
标签:count 遍历 科丁乐 飞神 ll K12137 二叉树 节点

题目描述
新年伊始,我飞买了一棵二叉树,传闻这棵二叉树的某一个节点上隐藏着上古的秘密,于是我飞开始昼夜不息的寻找。本着不遗漏任何一个节点的原则,飞神打算遍历整棵二叉树。
设S为飞神当前所处的节点。
若S有两个子节点L,R,则飞神总是先去遍历节点较少的那棵子树,然后再去遍历另一棵子树,若两棵子树的节点数相等,则飞神会先去遍历编号较小的那棵。

若S有一个子节点L,则飞神就去遍历以L为根结点的子树。

若S是叶子节点,则飞神会返回到S的父节点。

当飞神遍历完以S为根的子树时就会返回到S的父节点。

当飞神在某个节点发现宝藏时,遍历结束。

开始时,飞神在根结点。

现在给你一棵有n个节点的二叉树T,节点编号从1到n,节点1为根结点。

再给你藏有秘密的节点数X,请你计算出我飞需要访问的节点个数,重复访问的只记一次。

输入格式
多组输入,对于每组输入:

第一行包含一个整数n,x(1 <= x <= n <= 3*10^3),分别代表节点个数及藏宝节点编号。

接下来的n行,每行的第一个数为k(0 <= k <= 2),代表第i个节点的子节点个数。

继续读入k个整数,代表第i个节点的k个子节点,详见样例及提示。保证数据合法。

输出格式
对于每组数据,输出一个整数代表答案。

输入输出样例
输入样例1:
5 5
2 2 3
0
2 4 5
0
0
5 1
2 2 3
0
2 4 5
0
0
输出样例1:
5
1
说明
飞神的遍历路线为1->2->1->3->4->3->5。
科丁乐

【耗时限制】1000ms 【内存限制】128MB

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,x,ans,ok,cnt[2000000];
struct Node{
	ll l,r;
}t[200000];
ll count(ll r){
	if(!r)return 0;
	cnt[r]=count(t[r].l)+count(t[r].r)+1;
	return cnt[r];
}
void dfs(ll r){
	if(ok||!r)return;
	ans++;
	if(r==x)ok=1;
	if(cnt[t[r].l]<=cnt[t[r].r])dfs(t[r].l),dfs(t[r].r);
	else dfs(t[r].r),dfs(t[r].l);
}
int main(){
	while(~scanf("%lld%lld",&n,&x)){
		ans=ok=0;
		memset(t,0,sizeof t);
		for(ll	i=1;i<=n;i++){
			ll k,c[3]={0};
			scanf("%lld",&k);
			for(ll j=1;j<=k;j++)cin>>c[j];
			if(c[1]&&c[2]&&c[1]>c[2])swap(c[1],c[2]);
			t[i].l=c[1];
			t[i].r=c[2];
		}
		count(1);
		dfs(1);
		printf("%lld\n",ans);
	}
	
	return 0;
}

记得三连哦~~~

标签:count,遍历,科丁乐,飞神,ll,K12137,二叉树,节点
From: https://blog.csdn.net/xsz654321/article/details/144468914

相关文章

  • 开拓计划4 - 二叉树与并查集
    开拓计划4-二叉树与并查集二叉树二叉树的概念Q:什么是树?A:一种有\(n\)个节点最多有\(n-1\)条边的图。Q:什么是二叉树?A:每个节点都最多只有两个子节点的树。二叉树和递归Q:二叉树和递归有什么关系?A:在执行递归的时候总是会自己调用自己,每一次调用都会产生新的一层,新......
  • 代码随想录训练营第十七天| 654.最大二叉树 617.合并二叉树 700.二叉搜索树中的搜索 9
    654.最大二叉树  题目链接/文章讲解:代码随想录视频讲解:又是构造二叉树,又有很多坑!|LeetCode:654.最大二叉树_哔哩哔哩_bilibili创建一个根节点,其值为 nums 中的最大值。递归地在最大值 左边 的 子数组前缀上 构建左子树。递归地在最大值 右边 的 子数组......
  • 代码随想录训练营第十六天| 513. 找树左下角的值 112. 路径总和 106.从中序与后序遍历
    513.找树左下角的值 题目链接:513.找树左下角的值-力扣(LeetCode)讲解链接:代码随想录 求最后一行最后一个左子节点的值就是求二叉树深度最大的叶子节点递归:确定递归函数的参数和返回值参数必须有要遍历的树的根节点,还有就是一个int型的变量用来记录最长深度。这里......
  • 每日一刷——二叉树的构建——12.12
    第一题:最大二叉树题目描述:654.最大二叉树-力扣(LeetCode)我的想法:我感觉这个题目最开始大家都能想到的暴力做法就是遍历找到数组中的最大值,然后再遍历一遍,把在它左边的依次找到最大值,但是emmm,感觉效率很低,时间上肯定过不了然后其实我会觉得这个题目跟大根堆和小根堆有......
  • 数字组合转字母&删除二叉树节点&字符串相乘&打家劫舍ii&无序数组第k大 &无序数组前k大
    一、数字串转换为字符串1-26个数字分别代表26个字符(A-z)输入"12326〞就可以拆分为【1,2,3,2,6】、(12,3,2,6].[1,23,2,6]【1,23,26】、【12,3,26】等,将每种组合转成成对应字母输出,输出所有可能的结果返回所有可能的转换结果//将数字串转换成字母串//将数字串转换成字母......
  • 每日一刷——二叉树——12.09
    第一题:二叉树的层序遍历题目描述:102.二叉树的层序遍历-力扣(LeetCode)我的思路:拿到这个题目,我首先想到的是利用队列来模拟,给我二叉树的根节点,然后我来返回每一层的各个节点,但是为啥我甚至觉得这个题目给的输入就是按照层序遍历来给的呢??然后感觉还有一个点就是咋返回成几......
  • 线索二叉树——c语言详细注释版
        线索二叉树是一种特殊的二叉树,主要用于高效地实现树的遍历。与普通的二叉树相比,线索二叉树通过在节点中增加“线索”指针来简化遍历过程。值得注意的是,线索化二叉树的过程仍然需要使用递归,而后续遍历效率才会提高,适合一次构造,多次调用的场景。前言一般的二叉树在......
  • 二叉树篇
    classSolution{publicTreeNodesortedArrayToBST(int[]nums){returnsortedArrayToBST(nums,0,nums.length);}publicTreeNodesortedArrayToBST(int[]nums,intleft,intright){if(left>=right){retur......
  • 代码随想录day14 | leetcode 226.翻转二叉树 101. 对称二叉树 104.二叉树的最大深度 1
    226.翻转二叉树前序和后序写法都可以我用的是前序错误写法classSolution{publicTreeNodeinvertTree(TreeNoderoot){if(root==null)returnnull;swap(root.left,root.right);invertTree(root.left);invertTree(root.r......
  • 124. 二叉树中的最大路径和
    问题描述二叉树中的路径被定义为一条节点序列,序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中至多出现一次。该路径至少包含一个节点,且不一定经过根节点。路径和是路径中各节点值的总和。给你一个二叉树的根节点root,返回其最大路径和。分析树形D......