求根结点到指定结点的路径

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/cherish0222/article/details/56054987

Description

二叉树采用二叉链表存储结构进行存储,需要输出从二叉树的树根到指定结点的完整路径。按照给出的先序序列根据教材中算法6.4所示的算法建立二叉链表。二叉树中每个结点的数据都不相同。

Input

包含多组测试数据。
每组测试数据的第一行给出二叉树的先序遍历序列(结点数至少1个,不超过100个),用于建立二叉链表存储的二叉树。
第二行一个整数m,表示有m个结点需要输出从根节点到它自己的路径。
接下来m行,每行一个字符c,表示需要输出从根节点到本结点的路径。

Output

每组数据输出m行,每行为一个从根节点到对应结点之间的路径。

Sample Input 

ABC^^DE^G^^F^^^
3
A
D
G

Sample Output

A
ABD
ABDEG

分析:首先要建立一个二叉树吧,然后慢慢的找= =。从根结点粗发,用一个容器vector把找过的点放进去,找到了就输出返回,没找到再依次寻找左右子树~

参考代码:
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<string>
#include<algorithm>
#include<stack>
#include<queue>
#include<map>
#include<vector>
#include<iostream>
 
using namespace std;
typedef struct BiTNode{
    char d;
    struct BiTNode *l;
    struct BiTNode *r;
}*BiTree,BiTreeNode;
char ch;
bool flag;
 
void CreateBiTree( BiTree &T)
{
    char tmp;
    if( flag)
        scanf("%c",&tmp);
    else
    {
        tmp = ch;
        flag = true;
    }
 
    if( tmp == '^')
        T = NULL;
    else
    {
        T = new BiTreeNode;
        T->d = tmp;
        CreateBiTree( T->l);
        CreateBiTree( T->r);
    }
 
}
 
void findpath( BiTree &T, char x, vector<int> &v)
{
    if( T == NULL)
        return;
    v.push_back( T->d);
    if( T->d == x)
    {
        flag = 1;
        for( int i = 0; i < v.size(); i++)
            putchar(v[i]);
        putchar(10);
        return;
    }
    findpath( T->l, x, v);
    findpath( T->r, x, v);
    v.pop_back();
 
}
 
int main()
{
    while( ~scanf("%c",&ch))
    {
        if( ch == '\n')
            continue;
        BiTree T = NULL;
        flag = false;
        CreateBiTree( T);
 
        int n;
        scanf("%d",&n);
        char x;
        for( int i = 1; i <= n; i++)
        {
            scanf(" %c",&x);
            vector<int> v;
            findpath( T,x,v);
            //putchar(10);
        }
 
    }
 
    return 0;
}




阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页