C语言 通过中序遍历和后序遍历创建二叉树

FaramitaSpends 2015-01-16 05:38:09
如题,但是传递地址老是不对,该怎么改啊。
求帮助啊,谢谢谢谢!!

#include <stdio.h>
#include <string.h>

#define ElementType char

/*-----------------------------------------*/
//定义二叉树结构
//typedef struct TreeNode *BinTreeNode;
//typedef BinTree Position;
typedef struct TreeNode {
ElementType TData;
struct TreeNode *Left;
struct TreeNode *Right;
}BinTreeNode;

/*------------------------------------------*/
//函数声明部分




/*-----------------------------------------
-- 功能函数:由中序遍历和后续遍历得到树
-----------------------------------------*/
void TreeFrom_In_Post(BinTreeNode *TreeNode, char InOrder[], char PostOrder[], int lowInRange,int highInRange,int lowPostRange,int highPostRange)
{
TreeNode=(BinTreeNode *)malloc(sizeof(BinTreeNode));
TreeNode->TData=PostOrder[highPostRange];//记录树的根节点
TreeNode->Left=NULL;
TreeNode->Right=NULL;
//printf("%d\n",&TreeNode) ;
int root=lowInRange;

while(InOrder[root] != PostOrder[highPostRange]) //计算中序遍历中根节点的位置
{
root++;
}

int left_tree_length=root-lowInRange; //树中左子树长度

if(root>lowInRange) //遍历构建左子树
{//中序遍历和后续遍历中的左子树构建
TreeFrom_In_Post(TreeNode->Left,InOrder,PostOrder,lowInRange,root-1,lowPostRange,lowPostRange+left_tree_length-1);
}

if(root<highInRange) //遍历右子树
{//中序遍历和后续遍历中的左子树构建
TreeFrom_In_Post(TreeNode->Right,InOrder,PostOrder,root+1,highInRange,lowPostRange+left_tree_length,highPostRange-1);
}
}
/*-----------------------------------------
-- 功能函数:先序遍历
-----------------------------------------*/
void PreOrderTraversal (BinTreeNode *BT)
{
if(BT!=NULL){
printf("%c",BT->TData);
PreOrderTraversal (BT->Left);
PreOrderTraversal (BT->Right);
}
}

/*-----------------------------------------
-- 功能函数:中序遍历
-----------------------------------------*/
void InOrderTraversal (BinTreeNode *BT)
{
if(BT!=NULL){
InOrderTraversal (BT->Left);
printf("%c",BT->TData);
InOrderTraversal (BT->Right);
}
}

/*-----------------------------------------
-- 功能函数:后序遍历
-----------------------------------------*/
void PostOrderTraversal (BinTreeNode *BT)
{
if(BT!=NULL){
PostOrderTraversal (BT->Left);
PostOrderTraversal (BT->Right);
printf("%c",BT->TData);
}
}

/*-----------------------------------------
-- 功能函数:主函数
-----------------------------------------*/
int main()
{
char a[80],b[80];
BinTreeNode NewTree;
//NewTree=(BinTreeNode *)malloc(sizeof(BinTreeNode *));
printf("请先输入树的中序遍历结果,回车后输入后序遍历结果。\n");
printf("请输入中序遍历序列:");
gets(a);
printf("请输入后序遍历序列:");
gets(b);
TreeFrom_In_Post(&NewTree, a, b, 0,strlen(a)-1,0,strlen(b)-1);
//printf("main: %d",&NewTree);
printf("\n前序遍历结果:");
PreOrderTraversal (&NewTree);
printf("\n中序遍历结果:");
InOrderTraversal (NewTree);
printf("\n后序遍历结果:");
PostOrderTraversal (NewTree);
return 0;
}
...全文
945 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
zh_main 2016-02-21
  • 打赏
  • 举报
回复
引用 1 楼 FaramitaSpends 的回复:
问题解决了
请问你怎么解决的 我也在写这个代码 ,不过是知道先序和中序,求后序。请问我哪里错了 #include<cstdio> #include<cstdlib> #include<cstring> using namespace std; typedef struct Btree { struct Btree *left; struct Btree *right; char data; }Node; void Create_Btree(Node *tree, char *pre, int pre_low, int pre_high, char *middle, int middle_low, int middle_high) { tree = (Node *)malloc(sizeof(Node)); tree->data = pre[pre_low]; tree->left = NULL; tree->right = NULL; printf("shuju:%c %d %d\n", tree->data, tree->left, tree->right); //计算树根在中序遍历中的下标 int root = middle_low; int i = root; while(pre[pre_low] != middle[i]) { i++; root++; } printf("root : %d\n", root); //中序左子树的长度 int left_length = root - middle_low; printf("%d--%d %d--%d\n", pre_low + 1, pre_low + left_length, middle_low, root - 1); printf("%d--%d %d--%d\n", pre_low + left_length + 1, pre_high, root + 1, middle_high); //遍历创建左子树 if(root > middle_low) { printf("left\n"); Create_Btree(tree->left, pre, pre_low + 1, pre_low + left_length, middle, middle_low, root - 1); } //遍历创建右子树 if(root < middle_high) { printf("right\n"); Create_Btree(tree->right, pre, pre_low + left_length + 1, pre_high, middle, root + 1, middle_high); } } void Post_order(Node *head) { printf("%d\n", head); if(head == NULL) return; else Post_order(head->left); Post_order(head->right); printf("%c", head->data); } int main() { char pre_order[27]; char middle_order[27]; while(~scanf("%s %s", pre_order, middle_order) && pre_order != "") { printf("%s\n%s\n", pre_order, middle_order); Node *tree; int len = strlen(pre_order); Create_Btree(tree, pre_order, 0 , len - 1, middle_order, 0, len - 1); Post_order(tree); printf("\n"); } }
FaramitaSpends 2015-01-17
  • 打赏
  • 举报
回复
问题解决了

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧