C语言 二叉树 遍历问题
前序序列的顺序是根、左、右,序列ABCD第一个一定是根结点,A是根节点。
中序序列顺序是左、根、右,因为A是根节点,所以DCB位于A左侧,A右侧没有结点
再看DCB在前序序列中的顺序,第一个是B所以,B是DCB三个结点中的根。
再看B在中序序列,B的左边是DC,右边没有结点。
再看DC在前序序列中,C是根节点。
再看C在中序序列中,C左边是D
所以就可以恢复出这个二叉树
A
/
B
/
C
/
D
后序序列。。左、右、根,
首先你得程序语法上有很多错误,如:你创建树是函数名为BiTree CreateBiTree(),而你调用函数时用的却是CreateBiTree(T),本来定义时没参数的函数调用时代了参数肯定是错的(还有一些明显的语法错就不说了)。对于你问的“在CreateBiTree()这里在加一个T=NULL;是为什么”我想他的本意是当你输入“0”时表明该节点无某个孩子,设T为空。“CreateBiTree(T)改成T=CreateBiTree()就好了”说明你的CreateBiTree(T)函数不能改变main()中的T所以建议使用T地址传递即可改变main函数中定义的T即改为如下:
#include
#include
#include
typedef int ElemType;
typedef struct BiTNode
{
ElemType data;
struct BiTNode *lchild,*rchild;
}BiTNode;
typedef BiTNode *BiTree;
BiTree CreateBiTree(BiTree *T)
{
int x;
scanf("%d",&x);
if(x==0)
*T=NULL;
else
{
*T=(BiTNode *)malloc(sizeof(BiTNode));
if(!*T)
exit(-1);
(*T)->data=x;
CreateBiTree(&(*T)->lchild);
CreateBiTree(&(*T)->rchild);
}
return *T;
}
void PreOrder(BiTree T){
if(T!=NULL)
{
printf("%d ",T->data);
PreOrder(T->lchild);
PreOrder(T->rchild);
}
return;
}
void main( )
{
BiTree T;
printf("创建一个二叉树,按先序遍历的顺序输入数据,当无某一孩子时以0代替。
");
CreateBiTree(&T);
printf("创建完成
");
printf("创建的二叉树的前序遍历的序列为:
");
PreOrder(T);
}
注意:创建时最好自己先画个二叉树 照着输入。切记无孩子节点时输入0.
前序也成为先序,就是先访问根节点,然后访问左子树,最后访问右子树,中序,就是先访问左子树,然后访问根节点,最后访问右子树,后序,就是先访问左子树,然后访问右子树,最后访问根节点所以说先后是针对根节点而言的,呵呵,
我被你搞的头大了,我自学这些呢,就是二叉树不是总的可以分为根节点,左子树,右子树啊,那么所有便利都是左到右,上到下遍历的,但是为什么分前序 中序 后序?其实是说根节点什么时候访问?例如我先访问根节点到左子树最后到右子树就做先序,中序是:左子树,根节点,右子树,后续遍历如此类推,最后你说的除了 根节点以外 分3行??第一行是前序 2中序 3后序????请问为什么分3行?你的问题我不理解你要问什么请补充一一下好吧?我在学线索二叉树呢
荀耿唯健: //---------------------------------------------------------------------------#include<iostream> using namespace std; typedef struct node { struct node *L,*R; string name; }NODE;//输入 void Input(NODE **T,int num) { string name; int L,R; *T = new NODE[num]; for (...
深州市18223317596: 急求C语言写二叉树的遍历 - ?
荀耿唯健: 下面是一个用递归方法编的二叉树遍历程序,供lz参考. #include <stdio.h>//头文件#include <stdlib.h>#include <malloc.h> typedef struct bitnode { char data; struct bitnode *lchild,*rchild; } bitnode,*bitree;//定义结点类型 bitree createbitree()//创...
深州市18223317596: 二叉树遍历(c语言实现) - ?
荀耿唯健: #include <stdio.h>#include <malloc.h> typedef struct node{ int data; struct node *lchild,*rchild; }*treetp,tree; treetp create (treetp t,int c); void print1(treetp); void print2(treetp); void print3(treetp); int number=0; void main() { treetp t=0,r;r=create (t,0);...
深州市18223317596: 求二叉树的非递归后序遍历的c语言代码? - ?
荀耿唯健: #include<iostream> #include<stdio.h> #define N 10 using namespace std;char *a;typedef struct NODE{char data;struct NODE *lch, *rch,*parent; } *BINTREE,Node;void visit(char data){ printf("%5c",data); }void preorder(BINTREE T){ // 先...
深州市18223317596: 我C语言建立了一个二叉树,结果在遍历的时候出了问题,求高手看看. - ?
荀耿唯健: #include#include typedef struct node { int name[7]; int number; struct node *right; struct node *left; }point; typedef struct node1 { int items[9]; int front,rear; }duilie; point *creat(int *c,int pos,int num); void display(point *root); int main() { point *a; a=(...
深州市18223317596: C语言 二叉树的层次遍历出现错误 - ?
荀耿唯健: 程序仔细看了一下. 关键点是在层遍历的处理上,有一点点小问题. 应该是先压入当前树结点的左右子树,再弹出当前结点. 你却是先弹出了,那还结点都释放了,那里还有结点的左右子树呢? 修改如下,供参考: #include#include/*树结...
深州市18223317596: C语言数据结构“遍历二叉树” - ?
荀耿唯健: [答案]: ////////////////////////////////////////////////// 使用方法: 输入树的节点,输入0结束 1 2 3 4 5 6 7 8 9 0 中序打印 1->2->3->4->5->6->7->8->9-> 后序打印 9->8->7->6->5->4->3->2->1-> 前序打印 1->2->3->4->5->6->7->8->9-> 程序原码: ////////////////////////////////...
深州市18223317596: 帮忙看下 我用C语言写的 用栈实现二叉树的中序遍历 到底哪里出现了问题 - ?
荀耿唯健: 看了你写的代码,思路是没问题的.只是我有两点想要吐槽的..第一,格式很挫,我不知道是你本身的书写格式还是百度编辑成这个样子的,反正有点影响阅读...第二,对于指针的理解不够到位,你的程序之所以用第二种方法遍历没有输...
深州市18223317596: C语言二叉树的创建和遍历 - ?
荀耿唯健: 我写了一个二叉树你给看看 一定能行的我自己用了#include "stdio.h"#include "malloc.h"#include "string.h"#include "stdlib.h"#define Max 20 //结点的最大个数typedef struct BinTNode{char data;struct BinTNode *lchild,*rchild; ...
深州市18223317596: 用c语言编程实现二叉树的建立和遍历二叉树? - ?
荀耿唯健: //这是我上数据结构写的 建议理解为主#include#include#define ERROR 0#define OK 1#define OVERFLOW -2#define FLASE 0#define TURE 1 typedef int Status; typedef char TElemType; typedef struct BiTNode{ TElemType data; struct BiTNode ...