根结点到某结点的路径——模拟DFS过程

提示:

只给出先序遍历,就能还原出一颗树?莫要逗我!

诶,还真可以,为什么平时老师说必须要先序+中序才能还原一颗树(当然其他序也可以,仅做举例),是因为如果只给出先序遍历,不知道哪里应该在什么时候设置为空子树,也就是不知道该在什么地方终止往下递归。

但是如果用#表示不能继续往下递归了,那不就是说明了如果我按照题目要求去先序遍历,如果要停止了就会告诉我停止,这样的二叉树不就是唯一的嘛?

思路:

模拟先序遍历过程,还原一颗树即可。所以依旧是模板题,在做了几道类似的题目后发现:

  1. 如果只给出一种遍历让你还原一棵树,十有八九就是模拟递归过程。
  2. 而如果给出两种遍历让你还原一棵树,也是模板题,在前几年天梯赛考过,所以建议去学习一下。

参考代码:

#include<iostream>
#include<vector>
using namespace std;

struct Node {
    char val;
    Node* lhs;
    Node* rhs;
};

char endChar;
Node* dfs(Node* root) {
    char ch;    cin>>ch;
    if(ch == '#') return NULL;    // 如果是空节点,停止往下递归
    root = new Node();
    root->val = ch;
    root->lhs = dfs(root->lhs);
    root->rhs = dfs(root->rhs);
    return root;
}

void find(vector<char> path, Node* node) {
    if(node!=NULL && node->val == endChar) {
        path.push_back(endChar);
        for(int i=0;i<path.size();++i) {
            cout<<path[i]<<" ";
        }
        return;
    }
    if(node!=NULL) {
        path.push_back(node->val);
        find(path, node->lhs);
        find(path, node->rhs);
    }
}

int main() {
    Node* root;
    root = dfs(root);
    cin>>endChar;
    find(vector<char>(), root);
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

「江太白」

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

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

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

打赏作者

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

抵扣说明:

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

余额充值