树的中序和前序输出后序

实验思考

给前中序,怎么输出后序?

自我思考

还是一样跟中后序输出前序一样,只不过后序是最后一个是根,前序是第一个是根

//T->Left = BuildTree(Preorder + 1, Inorder, p);//中序中p把树分为两部分,当p等于0时没有左子树如上返回NULL,p代表左子树长度
//T->Right = BuildTree(Preorder + p + 1, Inorder + p + 1, N - p - 1);//p代表左子树长度,如果总长度减去左子树长度再减去根结点那一个为0就表示右子树没有长度,也就是没有右子树,就返回NULL
//如果右子树存在,那么右子树的根结点就在左右子树的根结点位置加上左子树结点数再加1那里(前序里面)。
//在中序中右子树根结点同左子树一样+p+1

这是关键的难点,还是在于怎么用中序在前后序中找到我们要的结点。

 

#include <stdio.h>
#include <stdlib.h>

typedef struct TNode* Position;
typedef Position BinTree;
struct TNode {
int data;
BinTree Left;
BinTree Right;
};

BinTree BuildTree(int Preorder[], int Inorder[], int N)
{
BinTree T;
int p;

if (!N) return NULL;

T = (BinTree)malloc(sizeof(struct TNode));
T->data = Inorder[0];
T->Left = T->Right = NULL;

for (p = 0; p < N; p++)
if (Preorder[0] == Inorder[p]) break;

T->Left = BuildTree(Preorder + 1, Inorder, p);//中序中p把树分为两部分,当p等于0时没有左子树如上返回NULL,p代表左子树长度
T->Right = BuildTree(Preorder + p + 1, Inorder + p + 1, N - p - 1);//p代表左子树长度,如果总长度减去左子树长度再减去根结点那一个为0就表示右子树没有长度,也就是没有右子树,就返回NULL
//如果右子树存在,那么右子树的根结点就在左右子树的根结点位置加上左子树结点数再加1那里(前序里面)。
//在中序中右子树根结点同左子树一样+p+1

return T;
}

void PostorderTraversal(BinTree T)
{
if (T)
{
PostorderTraversal(T->Left);
PostorderTraversal(T->Right);
printf("%d", T->data);
}
}

int main(void)
{
BinTree T;
int Preorder[10] = {}, Inorder[10], N,i;
scanf("%d", &N);
for (i = 0; i < N; i++)
scanf("%d", &Preorder[i]);
for (i = 0; i < N; i++)
scanf("%d", &Inorder[i]);
T = BuildTree(Preorder, Inorder, N);
PostorderTraversal(T);
return 0;
}

posted @ 2021-12-13 09:36  maintains  阅读(113)  评论(0)    收藏  举报