首页 > 其他分享 >洛谷[P1305 新二叉树] Tag:二叉树、基础数据结构

洛谷[P1305 新二叉树] Tag:二叉树、基础数据结构

时间:2023-09-13 23:35:54浏览次数:39  
标签:结点 ch 洛谷 P1305 遍历 二叉树 节点

P1305 新二叉树

题目描述:输入一串二叉树,输出其前序遍历。
输入格式:第一行为二叉树的节点数 $ n(1 \le n \le 26) $, 后面 \(n\) 行,每一个字母为节点,后两个字母分别为其左右儿子。特别地,数据保证第一行读入的节点必为根节点。空节点用 * 表示
输出格式:二叉树的前序遍历。

思路:对于二叉树中的每个结点, 将其类型定义为结构体类型, 结构体中的数据包括:当前节点的值、左儿子编号、右儿子编号。对于这类题目,基本上需要三个函数:第一个函数是新建节点, 第二个函数用来给结点添加儿子节点, 第三个函数用于输出遍历序列。对于此题, 每个结点为小写字母, 因此, 可以将每个结点 $ x $ 的编号定义为 $ x - 'a' + 1 $。对于先序遍历, 先递归左儿子然后递归右儿子即可。

点击查看代码
#include <bits/stdc++.h>
#define sz(a) ((int) (a).size())
using i64 = long long;

inline i64 read() {
    bool sym = false; i64 res = 0; char ch = getchar();
    while (!isdigit(ch)) sym |= (ch == '-'), ch = getchar();
    while (isdigit(ch)) res = (res << 3) + (res << 1) + (ch ^ 48), ch = getchar();
    return sym ? -res : res;
}

struct Node {
    char data, l, r;
    Node(char _d = '?', char _l = '?', char _r = '?') : data(_d), l(_l), r(_r) {}
};
const int N = 100 + 10;
Node nodes[N];
int idx;
void Newnode(char c) {
    nodes[c - 'a' + 1].data = c;
}
void add(char x, char y, bool addright) {
	//给结点x添加儿子节点y
    if (addright) nodes[x - 'a' + 1].r = y;
    else nodes[x - 'a' + 1].l = y;
}
void pre(int x) {
	// 求树的先序遍历结果
    printf("%c", nodes[x].data);
    if (nodes[x].l != '?') pre(nodes[x].l - 'a' + 1);
    if (nodes[x].r != '?') pre(nodes[x].r - 'a' + 1);
}

int main() {
    int n = read(), root = 0;
    for (int i = 1; i <= n; i++) {
        std::string s;
        std::cin >> s;
        if (i == 1) root = s[0] - 'a' + 1;
        for (auto c : s) {
            if (c != '*') Newnode(c);
        }
        if (s[1] != '*') add(s[0], s[1], false);
        if (s[2] != '*') add(s[0], s[2], true);
    }
    pre(root);
    return 0;
}//

标签:结点,ch,洛谷,P1305,遍历,二叉树,节点
From: https://www.cnblogs.com/LDUyanhy/p/17701079.html

相关文章

  • leetcode 二叉树的最大深度
    给定一个二叉树root,返回其最大深度。二叉树的最大深度是指从根节点到最远叶子节点的最长路径上的节点数。示例1:输入:root=[3,9,20,null,null,15,7]输出:3示例2:输入:root=[1,null,2]输出:2解题思路这里可以转化思路为计算当前节点左子树的深度和右子树的深度......
  • 洛谷 CF707C Pythagorean Triples の 题解
    这道题是一道数论题,不可用暴力通过,因为输入范围极大,基本上循环是不能在这道题上使用的了。前面大佬们讲的我听不懂,于是在教练的帮助下,我利用题面给出的多组样例找到了规律。在此之前,我们先设输入的数为\(n\)。\(n\)分三种情况。\(n\)是奇数;\(n\)是偶数;\(n\)小于等于......
  • 洛谷 P9503『MGOI』Simple Round I | B. 魔法照相馆 の 题解
    这道题是一道模拟题,坑点不多,但是细节特多,所以导致大部分人\(A\)不了这道题。这道题我也写了注释,如果思路没明白可以看代码和注释的。先创建一个长度为\(3\)的字符串\(s1\),这个字符串的意思就是模拟现在的这几个幕布的情况,这里分了四个字符代表着四种情况,详细如下该字符串......
  • 洛谷 P9502 『MGOI』Simple Round I | A. 魔法数字 の 题解
    直接用pow()函数暴力判断即可,一旦不符合条件就立即跳出循环,要注意开longlong或unsignedlonglong。#include<iostream>#include<cmath>usingnamespacestd;unsignedlonglongn,num;intmain(){cin>>n;for(unsignedlonglongi=2;i<=n;i+=......
  • 洛谷 UVA10852 Less Prime の 题解
    这道题更像是结论题,因为他要推一个小结论,才能做出这道题。大概思路是先打个素数表,存到数组\(a\)内,\(cnt\)是素数表的最后一个元素的下标。之后循环\(M\)次去输入\(N\),每次输入\(N\)之前都要定义两个变量,分别是\(mx\),存\(n-p\cdotx\)的最大值,\(ans\)则是当\(n-......
  • 洛谷 UVA10714 Ants の 题解
    这道题只有一个点比较难想。大概思路就是先输入个$t$,表示要跑几轮,后面的照常输入。因为蚂蚁都是一样的,所以两个蚂蚁碰面的时候相互穿过和各自掉头是没有区别的,我们按照前者模拟就好,其余思路暴力求解即可。#include<iostream>#include<cmath>usingnamespacestd;intt;in......
  • 洛谷 AT_past202005_i 行列操作 の 题解
    这道题最难的点在于用什么方法存储矩阵$a$和一个特殊的操作方式。要存矩阵$a$,最先想到的是二维数组,但是二维数组开不到$1\len\le10^5$,所以可以用一个长度为$2\cdotn$的一维数组$m$来存。当$i\len$时,让一维数组$m_{i}$负责存第$i$行的内容;而当$n+1\lei......
  • 洛谷 AT_maximum_cup_2018_a フィギュアスケート界の貴公子埼大選手 の 题解
    这道题是一道水题,所以你的代码很可能与我相似或相同,如果你的代码出现了问题,你很可能在我的题解里找出答案。这道题大概思路是一旦$10$秒后运动员会接触到毛绒玩具,那么就加上在这个点上毛绒玩具的数量。但是!这道题有一道巨坑的点!由于这道题比较远古,所以说你即使是正解,你也要在......
  • 平衡二叉树(Balanced Binary Tree)
    平衡二叉树(BalancedBinaryTree)平衡二叉树是一种特殊的二叉搜索树,它具有以下特点:每个节点的左子树和右子树的高度差不超过1。所有的子树也都是平衡二叉树。通过保持平衡性,平衡二叉树可以在最坏情况下仍然具有较好的性能,保证查找、插入和删除操作的时间复杂度为O(logn)。......
  • leetcode450删除搜索二叉树的节点
    删除的二叉树节点分4种情况:叶子节点,直接删除就行左节点不为空,右节点为空;直接将左子树返回左节点为空,右节点不为空;直接将右子树返回左节点和右节点不为空;将右子树最小的节点作为根节点,返回右子树TreeNode*deleteNode(TreeNode*root,intkey){if(!root)returnn......