求先序遍历

简介:

代码如下:

#include <stdio.h>

struct TreeNode
{
    struct TreeNode* left;
    struct TreeNode* right;
    char  elem;
};


TreeNode* BinaryTreeFromOrderings(char* inorder, char* aftorder, int length)
{
    if(length == 0)
    {
        return NULL;
    }

    TreeNode* node = new TreeNode;		//新建一个树节点
    node->elem = *(aftorder+length-1);

	printf("%c ",node->elem);

    int rootIndex = 0;

    for(;rootIndex < length; rootIndex++)		//找这个根节点
    {
        if(inorder[rootIndex] ==  *(aftorder+length-1))
            break;
    }

    node->left = BinaryTreeFromOrderings(inorder, aftorder , rootIndex);
    node->right = BinaryTreeFromOrderings(inorder + rootIndex + 1, aftorder + rootIndex , length - (rootIndex + 1));
    
    return node;
}

int main()
{
	char* in="42513";		//中序
    char* af="45231";		//后序
    BinaryTreeFromOrderings(in, af, 5); 

	printf("\n");

    return 0;
}


暂时无法判断非法输入的代码:

#include <stdio.h>
#include <iostream>
#include <string.h>
#define MAXN 5005

using namespace std;

char in[MAXN];       //中序
char af[MAXN];       //后序
char ans[MAXN];		//最后输出的前序序列
int count=0;

struct TreeNode
{
    struct TreeNode* left;
    struct TreeNode* right;
    char  elem;
};


TreeNode* BinTree(char* inorder, char* aftorder, int length)
{
    if(length == 0)
    {
        return NULL;
    }

    TreeNode* node = new TreeNode;		//新建一个树节点
    node->elem = *(aftorder+length-1);

	ans[count++]=node->elem;		//存入答案

    int rootIndex = 0;

    for( ;rootIndex<length;rootIndex++)		//找这个根节点
    {
        if(inorder[rootIndex]==*(aftorder+length-1))
            break;
    }

    node->left = BinTree(inorder,aftorder,rootIndex);
    node->right = BinTree(inorder+rootIndex+1 , aftorder+rootIndex , length-(rootIndex+1));

	return node;
}

int main()
{
	int n;
	scanf("%d",&n);

	int i;
	for(i=0;i<n;i++)
		cin>>in[i];

	for(i=0;i<n;i++)
		cin>>af[i];

    BinTree(in, af, n);

	for(i=0;i<strlen(ans)-1;i++)
		printf("%c ",ans[i]);
	printf("%c\n",ans[i]);

    return 0;
}

改用int型:

#include <stdio.h>
#include <stdlib.h>
#define MAXN 5005


int in[MAXN];       //中序
int af[MAXN];       //后序
int ans[MAXN];		//最后输出的前序序列
int count=0;

struct TreeNode
{
    struct TreeNode* left;
    struct TreeNode* right;
    int elem;
};


TreeNode* BinTree(int inorder[], int aftorder[], int length)
{
	if(length == 0)
    {
        return NULL;
    }

    TreeNode* node = new TreeNode;		//新建一个树节点
    node->elem = *(aftorder+length-1);

	ans[count++]=node->elem;		//存入答案

    int rootIndex=0;

    for( ;rootIndex<length;rootIndex++)		//在中序遍历中找这个根节点
    {
        if(inorder[rootIndex]==*(aftorder+length-1))
            break;
    }
	if(rootIndex>=length)
	{
		printf("-1\n");
		exit(0);
	}

    node->left = BinTree(inorder,aftorder,rootIndex);
    node->right = BinTree(inorder+rootIndex+1 , aftorder+rootIndex , length-(rootIndex+1));

	return node;
}

int main()
{
	int n;
	scanf("%d",&n);

	int i;
	for(i=0;i<n;i++)
		scanf("%d",&in[i]);

	for(i=0;i<n;i++)
		scanf("%d",&af[i]);

    BinTree(in,af,n);

	for(i=0;i<count-1;i++)
		printf("%d ",ans[i]);
	printf("%d\n",ans[i]);

    return 0;
}


相关文章
|
4月前
二叉树的前序遍历、中序遍历、后序遍历
二叉树的前序遍历、中序遍历、后序遍历
|
4月前
|
C++
二叉树的后序遍历(C++)
二叉树的后序遍历(C++)
20 0
|
4月前
|
C++
二叉树的前序遍历(C++)
二叉树的前序遍历(C++)
26 0
二叉树的前序遍历(C++)
|
5月前
|
Linux
求二叉树的先序遍历
求二叉树的先序遍历
|
10月前
1339:【例3-4】求后序遍历
1339:【例3-4】求后序遍历
|
5月前
二叉树的前、中、后序遍历的实现
二叉树的前、中、后序遍历的实现
|
JavaScript 前端开发 Java
二叉树的先序、中序、后序遍历
二叉树的先序、中序、后序遍历
106 0
二叉树的先序、中序、后序遍历
|
存储 索引
根据前序遍历和[中序遍历]
根据前序遍历和[中序遍历]
78 0