洛谷P1305: 新二叉树

洛谷P1305: 新二叉树

题目描述

输入一串二叉树,输出其前序遍历

样例
第一行为二叉树的节点数 n(1≤n≤26)

后面n行,每一个字母为节点,后两个字母分别为其左右儿子。
    
空节点用 * 表示
输出格式: 二叉树的前序遍历
    
输入 
6
abc
bdi
cj*
d**
i**
j**
输出 
abdicj

算法 递归

  • 使用左右指针建树
    • 建立树的根节点创建左右节点
    • 查找给定数值对应的节点,重复建立节点
  • 递归前序遍历
时空分析

时间复杂度: 递归查找给定数值的节点,最坏的时间复杂度 O(n) , 遍历 n 次,时间复杂度最坏 O(n^2)

C++ 代码
#include <bits/stdc++.h>

using namespace std;

struct TreeNode
{
    char val;
    TreeNode *left;
    TreeNode *right;
    TreeNode(char x = 0):val(x),left(NULL),right(NULL){}
};

void preOrder(TreeNode* root)
{
    if (root) 
        cout<<root->val;
    else
        return;
    
    preOrder(root->left);
    preOrder(root->right);
}

TreeNode* CreateNode(char ch)
{
    if (ch=='*') 
        return NULL;
    return new TreeNode(ch);
}

//在root树中寻找节点数值为ch的子树
TreeNode* find_tree(TreeNode* root, char ch)
{
    if (!root)  return NULL;
    if(root->val == ch) return root;
    TreeNode* target = NULL;
    if (root->left) target = find_tree(root->left, ch);
    if (target) return target;
    if (root->right) target = find_tree(root->right, ch);
    return target;
}

int main()
{
    int num;
    char val1,val2,val3;
    cin >> num;
    cin >> val1>>val2>>val3;
    TreeNode*root = new TreeNode(val1);
    root->left = CreateNode(val2);
    root->right = CreateNode(val3);
    
    for (int i = 1; i < num; i++)
    {
        cin >> val1 >> val2 >> val3;
        TreeNode*_root = find_tree(root, val1);
        _root->left = CreateNode(val2);
        _root->right = CreateNode(val3);
    }
    //前序遍历
    preOrder(root);
    
    return 0;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Erice_s

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值