二叉树构造与遍历的C程序实现代码
来源:互联网 发布:用c语言产生随机数 编辑:程序博客网 时间:2024/05/16 04:36
#include <stdio.h>
#include <stdlib.h>
typedef struct Node
{
char value;
struct Node *leftChild;
struct Node *rightChild;
}TreeNode;
{
TreeNode *node = (TreeNode*)malloc(sizeof(TreeNode));
int midLeft1,midRight1,pstLeft1,pstRight1,rootPos=0;
if(midRight-midLeft != pstRight-pstLeft)
{
printf("错误:输入的中序和后序序列结点个数不一样!\n");
return node;
}
for(;mid[rootPos]!=pst[pstRight];rootPos++);
node->value = pst[pstRight];;
node->leftChild = NULL;
node->rightChild = NULL;
midRight1 = rootPos-1;
pstRight1 = pstLeft+(midRight1-midLeft);
node->leftChild = CreateFromMidPst(mid,midLeft,midRight1,pst,pstLeft,pstRight1);
}
if(rootPos!=midRight)
{
midLeft1 = rootPos+1;
pstLeft1 = pstLeft+rootPos-midLeft;
node->rightChild = CreateFromMidPst(mid,midLeft1,midRight,pst,pstLeft1,pstRight-1);
}
return node;
}
{
TreeNode *node = (TreeNode*)malloc(sizeof(TreeNode));
int midLeft1,midRight1,preLeft1,preRight1,rootPos=0;
if(midRight-midLeft != preRight-preLeft)
{
printf("错误:输入的中序和前序序列结点个数不一样!\n");
return node;
}
node->value = pre[preLeft];
node->leftChild = NULL;
node->rightChild = NULL;
for(;mid[rootPos]!=pre[preLeft];rootPos++);
if(rootPos!=midLeft)
{
midRight1 = rootPos-1;
preRight1 = rootPos-midLeft+preLeft;
node->leftChild = CreateFromMidPre(mid,midLeft,midRight1,pre,preLeft+1,preRight1);
}
if(rootPos!=midRight)
{
midLeft1 = rootPos+1;
preLeft1 = rootPos-midLeft+preLeft+1;
node->rightChild = CreateFromMidPre(mid,midLeft1,midRight,pre,preLeft1,preRight);
}
return node;
}
//前序遍历二叉树
void PreTraverse(TreeNode *root)
{
if(root==NULL)
return;
printf("%c",root->value);
PreTraverse(root->leftChild);
PreTraverse(root->rightChild);
return;
}
{
if(root==NULL)
return;
MidTraverse(root->leftChild);
printf("%c",root->value);
MidTraverse(root->rightChild);
return;
}
{
if(root==NULL)
return;
PstTraverse(root->leftChild);
PstTraverse(root->rightChild);
printf("%c",root->value);
return;
}
{
TreeNode *root1,*root2;
char preSeq[20],midSeq[20],pstSeq[20];
int i=0,numNode;
printf("请输入节点总数:\n");
scanf("%d",&numNode);
fflush(stdin);
printf("请输入先序序列:\n");
do
{
scanf("%c",preSeq+i);
i++;
}
while(i!=numNode);
fflush(stdin);
i=0;
printf("请输入中序序列:\n");
do
{
scanf("%c",midSeq+i);
i++;
}
while(i!=numNode);
fflush(stdin);
i=0;
printf("请输入后序序列:\n");
do
{
scanf("%c",pstSeq+i);
i++;
}
while(i!=numNode);
fflush(stdin);
root1=CreateFromMidPre(midSeq,0,i-1,preSeq,0,i-1);
printf("\n");
printf("前序序列:\n");
PreTraverse(root1);
printf("\n");
printf("中序序列:\n");
MidTraverse(root1);
printf("\n");
printf("后序序列:\n");
PstTraverse(root1);
printf("\n");
root2=CreateFromMidPst(midSeq,0,i-1,pstSeq,0,i-1);
printf("\n");
printf("前序序列:\n");
PreTraverse(root2);
printf("\n");
printf("中序序列:\n");
MidTraverse(root2);
printf("\n");
printf("后序序列:\n");
PstTraverse(root2);
printf("\n");
return 1;
}
#include <stdlib.h>
typedef struct Node
{
char value;
struct Node *leftChild;
struct Node *rightChild;
}TreeNode;
//根据中序和后序序列构造二叉树
{
TreeNode *node = (TreeNode*)malloc(sizeof(TreeNode));
int midLeft1,midRight1,pstLeft1,pstRight1,rootPos=0;
if(midRight-midLeft != pstRight-pstLeft)
{
printf("错误:输入的中序和后序序列结点个数不一样!\n");
return node;
}
for(;mid[rootPos]!=pst[pstRight];rootPos++);
node->value = pst[pstRight];;
node->leftChild = NULL;
node->rightChild = NULL;
if(rootPos!=midLeft)
{midRight1 = rootPos-1;
pstRight1 = pstLeft+(midRight1-midLeft);
node->leftChild = CreateFromMidPst(mid,midLeft,midRight1,pst,pstLeft,pstRight1);
}
if(rootPos!=midRight)
{
midLeft1 = rootPos+1;
pstLeft1 = pstLeft+rootPos-midLeft;
node->rightChild = CreateFromMidPst(mid,midLeft1,midRight,pst,pstLeft1,pstRight-1);
}
return node;
}
//根据中序和前序序列构造二叉树
{
TreeNode *node = (TreeNode*)malloc(sizeof(TreeNode));
int midLeft1,midRight1,preLeft1,preRight1,rootPos=0;
if(midRight-midLeft != preRight-preLeft)
{
printf("错误:输入的中序和前序序列结点个数不一样!\n");
return node;
}
node->value = pre[preLeft];
node->leftChild = NULL;
node->rightChild = NULL;
for(;mid[rootPos]!=pre[preLeft];rootPos++);
if(rootPos!=midLeft)
{
midRight1 = rootPos-1;
preRight1 = rootPos-midLeft+preLeft;
node->leftChild = CreateFromMidPre(mid,midLeft,midRight1,pre,preLeft+1,preRight1);
}
if(rootPos!=midRight)
{
midLeft1 = rootPos+1;
preLeft1 = rootPos-midLeft+preLeft+1;
node->rightChild = CreateFromMidPre(mid,midLeft1,midRight,pre,preLeft1,preRight);
}
return node;
}
//前序遍历二叉树
void PreTraverse(TreeNode *root)
{
if(root==NULL)
return;
printf("%c",root->value);
PreTraverse(root->leftChild);
PreTraverse(root->rightChild);
return;
}
//中序遍历二叉树
{
if(root==NULL)
return;
MidTraverse(root->leftChild);
printf("%c",root->value);
MidTraverse(root->rightChild);
return;
}
//后序遍历二叉树
{
if(root==NULL)
return;
PstTraverse(root->leftChild);
PstTraverse(root->rightChild);
printf("%c",root->value);
return;
}
{
TreeNode *root1,*root2;
char preSeq[20],midSeq[20],pstSeq[20];
int i=0,numNode;
printf("请输入节点总数:\n");
scanf("%d",&numNode);
fflush(stdin);
printf("请输入先序序列:\n");
do
{
scanf("%c",preSeq+i);
i++;
}
while(i!=numNode);
fflush(stdin);
i=0;
printf("请输入中序序列:\n");
do
{
scanf("%c",midSeq+i);
i++;
}
while(i!=numNode);
fflush(stdin);
i=0;
printf("请输入后序序列:\n");
do
{
scanf("%c",pstSeq+i);
i++;
}
while(i!=numNode);
fflush(stdin);
root1=CreateFromMidPre(midSeq,0,i-1,preSeq,0,i-1);
printf("\n");
printf("前序序列:\n");
PreTraverse(root1);
printf("\n");
printf("中序序列:\n");
MidTraverse(root1);
printf("\n");
printf("后序序列:\n");
PstTraverse(root1);
printf("\n");
root2=CreateFromMidPst(midSeq,0,i-1,pstSeq,0,i-1);
printf("\n");
printf("前序序列:\n");
PreTraverse(root2);
printf("\n");
printf("中序序列:\n");
MidTraverse(root2);
printf("\n");
printf("后序序列:\n");
PstTraverse(root2);
printf("\n");
return 1;
}
- 二叉树构造与遍历的C程序实现代码
- 二叉查找树的构造与遍历[Java实现]
- 二叉查找树的构造与遍历[Java实现]
- 完全二叉树的构造与遍历
- 排序二叉树的构造与遍历
- 二叉树的构造与遍历
- 二叉树的构造与遍历
- 二叉树的构造与遍历
- 二叉树构造与遍历
- 二叉树的创建与遍历(C语言实现)
- 二叉树的遍历(代码实现)
- java代码实现二叉树的遍历
- 二叉树的构造 遍历
- 由先序遍历和中序遍历构造二叉树的二叉链表代码
- C语言实现二叉树的遍历
- C实现二叉树的各种遍历
- 3.14(c程序实现)已知二叉树的前序遍历和中序遍历,求后序遍历
- c语言实现二叉树(BiNodeTree)的建立与先序遍历,中序遍历
- 学习用 doxygen 生成源码文档
- 8/26/2011 10:19:38 PM
- hdu3974 线段树-2
- django模板
- 我为什么也选择了 python
- 二叉树构造与遍历的C程序实现代码
- 解题笔记(29)——珠子问题
- boost 之正则表达式
- 【转】学PS基础:Photoshop 技能167个 经典的Photoshop技巧大全,如果你是初级阶段的水平,熟读此文并掌握,马上进阶为中级水平。
- 【转】教你电脑自动开机并播放音乐提醒你起床,并且晚上自动关机
- NoSQL开篇——为什么要使用NoSQL
- 主题:spring安全框架应用
- 金和C6V2.6硬件狗解除。密钥制作。
- 为什么我们程序员难晋升