openjudge 文本二叉树

本文介绍了一种通过文本表示法构建二叉树并进行前序、后序、中序遍历的方法。详细解释了如何从文本中解析树的结构,并提供了相应的算法实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文本二叉树

查看 提交 统计 提问

总时间限制: 1000ms 内存限制: 65536kB

描述

如上图,一棵每个节点都是一个字母,且字母互不相同的二叉树,可以用以下若干行文本表示:

 

 

A

-B

--*

--C

-D

--E

---*

---F

 

 

在这若干行文本中:

 

1) 每个字母代表一个节点。该字母在文本中是第几行,就称该节点的行号是几。根在第1

2) 每个字母左边的'-'字符的个数代表该结点在树中的层次(树根位于第0层)

3) 若某第 层的非根节点在文本中位于第n行,则其父节点必然是第 i-1 层的节点中,行号小于n,且行号与n的差最小的那个

4) 若某文本中位于第n行的节点(层次是i) 有两个子节点,则第n+1行就是其左子节点,右子节点是n+1行以下第一个层次为i+1的节点

5) 若某第 层的节点在文本中位于第n行,且其没有左子节点而有右子节点,那么它的下一行就是 i+1'-' 字符再加上一个 '*' 

 

 

给出一棵树的文本表示法,要求输出该数的前序、后序、中序遍历结果

输入

第一行是树的数目 n

 

接下来是n棵树,每棵树以'0'结尾。'0'不是树的一部分

每棵树不超过100个节点

输出

对每棵树,分三行先后输出其前序、后序、中序遍历结果

两棵树之间以空行分隔

样例输入

2

A

-B

--*

--C

-D

--E

---*

---F

0

A

-B

-C

0

样例输出

ABCDEF

CBFEDA

BCAEFD

 

ABC

BCA

BAC

来源

Guo Wei

#include<iostream>
using namespace std;
#include<stdio.h>
#include<malloc.h>
#include<string.h>
#include<stdlib.h>
#define Floor 10
typedef char ElemType;
typedef struct Nodes
{
	ElemType data;
	int d;                     //用来记录左右,0左1右
    	int deepth;                //记录层次
	struct Nodes *lchild;
	struct Nodes *rchild;
}BTreeNode;

int A(BTreeNode *t)
{
    printf("%c",t ->data);
    if(t ->lchild != NULL)
        A(t ->lchild);
    if(t ->rchild != NULL)
        A(t ->rchild);
    return 0;
}

int B(BTreeNode *t)
{
    if(t ->lchild != NULL)
        B(t ->lchild);
    printf("%c",t ->data);
    if(t ->rchild != NULL)
        B(t ->rchild);
    return 0;
}

int C(BTreeNode *t)
{
    if(t ->lchild != NULL)
        C(t ->lchild);
    if(t ->rchild != NULL)
        C(t ->rchild);
    printf("%c",t ->data);
    return 0;
}
bool TextCreateTree(BTreeNode *&h)
{
    	int top = -1;
	char temp[Floor];
	BTreeNode *stack[101];
	BTreeNode *p1,*p2;
	scanf("%s",temp);
	h = p1 = (BTreeNode *)malloc(sizeof(BTreeNode));
	p1 ->data = temp[strlen(temp)-1];
	p1 ->d = 0;
	p1 ->deepth = strlen(temp)-1;
	p1 ->lchild = p1 ->rchild = NULL;
	stack[++top] = p1;
   	 while(~scanf("%s",temp))
	{
		if(temp[strlen(temp)-1] == '0')
		{
			break;
		}
		p2 = (BTreeNode *)malloc(sizeof(BTreeNode));
		p2 ->data = temp[strlen(temp)-1];
		p2 ->d = 0;
		p2 ->deepth = strlen(temp)-1;
		p2 ->lchild = p2 ->rchild = NULL;
       		p1 = stack[top];
		while(p2 ->deepth - p1 ->deepth != 1 )
		{
			top--;
			p1 = stack[top];
		}
		if(p2 ->data =='*')
		{
			p1 ->d++;
			continue;
		}
		if(p1 ->d == 0)
		{
            		p1 ->lchild = p2;
			p1 ->d++;
		} 
       		 else if(p1 ->d == 1)
    		{
        		p1 ->rchild = p2;
			p1 ->d++;
	        }
        	if(p1 ->d == 2)
	        {
        	    top--;
        	}
	        stack[++top] = p2;
	}
	return 0;
}


int main()
{
    int n;
    scanf("%d",&n);
    getchar();
    while(n--)
    {
        BTreeNode *h;
        TextCreateTree(h);
        A(h);
        printf("\n");
        C(h);
        printf("\n");
        B(h);
        printf("\n\n");
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值