当前位置:首页 » 编程语言 » 后序遍历c语言

后序遍历c语言

发布时间: 2022-10-07 23:33:47

Ⅰ 数据结构用c语言写:创建树,并进行先序,中序,后序遍历!

#include <iostream>
using namespace std;

class Node
{
public:
Node(){ this->pLchild = this->pRchild = NULL; }
char data;
Node * pLchild;
Node * pRchild;
};
Node * CreateTree()
{
Node * root = new Node;
root->data = 'A';
Node * pB = new Node;
pB->data = 'B';
Node * pC = new Node;
pC->data = 'C';
Node * pD = new Node;
pD->data = 'D';
Node * pE = new Node;
pE->data = 'E';

root->pLchild = pB;
root->pRchild = pC;
pC->pLchild = pD;
pD->pRchild = pE;

return root;
}
void InTraverseTree(Node * pT) //中序遍历
{
if (NULL == pT)
return;
else
{
InTraverseTree(pT->pLchild);
cout << pT->data;
InTraverseTree(pT->pRchild);

}
}
void PostTraverseTree(Node * pT) //后序遍历
{
if (NULL == pT)
return;
else
{
PostTraverseTree(pT->pLchild);

PostTraverseTree(pT->pRchild);
cout << pT->data;
}
}
void PreTraverseTree(Node * pT) //先序遍历
{
if (NULL==pT)
{
return;
}
else
{
cout << pT->data;
PreTraverseTree(pT->pLchild);
PreTraverseTree(pT->pRchild);
}
}
void destroyTree(Node * PT) //销毁二叉树
{
if (NULL == PT)
return;
else
{
destroyTree(PT->pLchild);
destroyTree(PT->pRchild);
delete PT;
}

}
int main()
{
Node * pT = CreateTree();
cout << "先序遍历";

PreTraverseTree(pT);

destroyTree(pT);
/*cout << "\n中序遍历" ;
InTraverseTree(pT);
cout << "\n后序遍历";
PostTraverseTree(pT);*/
// PreTraverseTree(pT);
//cout << endl;
system("pause");
return 0;
}
用C++写的 不过跟C没什么区别

Ⅱ c语言 二叉树先 中 后序遍历的函数体

void PreOrderTraverse(BiTree T) /*先序遍历*/

if(T!=NULL)
{
printf("%c ",T->data);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}

void InOrderTraverse(BiTree T)/*中序遍历*/
{
if(T!=NULL)
{
InOrderTraverse(T->lchild);
printf("%c ",T->data);
InOrderTraverse(T->rchild);
}
}

void PostOrderTraverse(BiTree T) /*后序遍历*/
{
if(T!=NULL)
{
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
printf("%c ",T->data);
}
}

Ⅲ C语言数据结构,急求在线二叉树先序中序后序递归遍历

#include
<iostream.h>
#include
<stdio.h>
#include
<malloc.h>
#define
MaxNode
100
typedef
char
DataType;
typedef
struct
node
{
DataType
data;
struct
node
*lchild;
struct
node
*rchild;
}BiTNode,BiTree;
void
CreateBiTree(BiTree
*bt)//建立一个二叉树
{
char
ch;
//ch=getchar();
scanf("%c",&ch);
if
(ch=='
')
bt=NULL;
else{
bt=(BiTree*)malloc(sizeof(BiTNode));
bt->data=ch;
CreateBiTree(bt->lchild);
CreateBiTree(bt->rchild);
}
}
void
PreOrder(BiTree
*root)//前序遍历
{
if(root!=NULL)
{
Visit(root->data);
PreOrder(root->lchild);
PreOrder(root->rchild);
}
}
void
InOrder(BiTree
*root)//中序遍历
{
if(root!=NULL)
{
InOrder(root->lchild);
Visit(root->data);
InOrder(root->rchild);
}
}
void
LaOrder(BiTree
*root)//后序遍历
{
if(root!=NULL)
{
PreOrder(root->lchild);
PreOrder(root->rchild);
Visit(root->data);
}
}
void
main()
{
BiTree
*bt;
printf("请输入数据:\n");
bt=
NULL;
CreateBiTree(bt);
//and
here
printf("\n
结果如下:\n");
printf("先序遍历的结果为:\n");
PreOrder(bt);
printf("\n");
printf("中序遍历的结果为:\n");
InOrder(bt);
printf("\n");
printf("后序遍历的结果为:\n");
LaOrder(bt);
}
有个Visit()函数
你没写!!
我只是改了语法错误!!
只剩那一个函数没定义
你定义下就没语法错误了!

Ⅳ C语言中,到底先序遍历、中序遍历、后续遍历怎么看的...真的快疯掉了!求高人指点指点...泪目

先序遍历就是“根左右”,不管你现在在哪个节点,都是按这种规则。上面的题目:根是A,左是B,右是C,所以是A-》B,在当前根节点B,还是按上述规则,那么接下来到D,D之后没有子节点,返回B,遍历E-》X,X之后没有子节点,返回E,E的子节点都遍历完了,返回B,B的子节点都遍历完了,返回A,接下来遍历右子树,规则同上。
中序遍历就是“左根右”,对于A来说,先遍历B,对于B来说,先遍历D,对于D来说,已经没有左子树,所以遍历D,D没有右子树,返回B,遍历B,B有右子树E,对于E来说,先遍历X,完了返回E,E完了返回B,B完了返回A,遍历A,遍历右子树,规则同上。
后序遍历就是跟先序遍历相反的,先遍历右子树,再左子树,最后才是根。
好好思考一下。

Ⅳ 求二叉树后序遍历非递归算法c语言版

#include<stdio.h>
#include<iostream.h>
#include<stdlib.h>
#define Maxsize 100
typedef int datatype;

typedef struct node
{
datatype data;
struct node* lchild;
struct node* rchild;
}BTNode;

void CreatBTNode(BTNode *&b,char * str)
{
BTNode *p,*st[Maxsize];
int top=-1;
p=NULL;
b=NULL;
int j=0,k;
char ch=str[j];
while(ch!='\0')
{
switch(ch)
{
case '(':top++;st[top]=p;k=1;break;
case ')':top--;break;
case ',':k=2;break;
default:p=(BTNode *)malloc(sizeof(BTNode));
p->data=ch;p->lchild=p->rchild=NULL;
if(b==NULL)
{
b=p;
}
else
{
switch(k)
{
case 1:st[top]->lchild=p;break;
case 2:st[top]->rchild=p;break;
}
}
}
j++;ch=str[j];
}

}

void DispBTNode(BTNode *b)
{
if(b!=NULL)
{
printf("%c",b->data);
if(b->lchild!=NULL||b->rchild!=NULL)
{
printf("(");
DispBTNode(b->lchild);
if(b->rchild!=NULL)
printf(",");
DispBTNode(b->rchild);
printf(")");
}
}

}

BTNode *FindNode(BTNode *b,char x)
{
BTNode *p=NULL;
if(b==NULL)
{
return NULL;
}
else if(b->data==x)
{
return b;
}
else
{
p=FindNode(b->lchild,x);
if(p!=NULL)
{
return p;
}
else
{
return FindNode(b->rchild,x);
}
}
}

void PostOrderl(BTNode *b)
{
BTNode *st[Maxsize],*p;
int flag,top=-1;
if(b!=NULL)
{
do
{
while(b!=NULL)
{
top++;
st[top]=b;
b=b->lchild;
}
p=NULL;
flag=1;
while(top!=-1&&flag)
{
b=st[top];
if(b->rchild==p)
{
printf("%c",b->data);
top--;
p=b;
}
else
{
b=b->rchild;
flag=0;
}

}
}while(top!=-1);
printf("\n");
}

}

void main()
{
BTNode *b,*q;
char str[100];
printf("您输入的二叉树为\n");
scanf("%s",&str);
CreatBTNode(b,str);
DispBTNode(b);
q=FindNode(b,'A');
printf("\n");
printf("*********************************\n");
printf("%c\n",q->data);
printf("它的后序序列为:\n");
PostOrderl(b);

}

Ⅵ 设计一个c语言程序,实现二叉树的前序、中序、后序的递归、非递归遍历运算

#include<malloc.h> // malloc()等
#include<stdio.h> // 标准输入输出头文件,包括EOF(=^Z或F6),NULL等
#include<stdlib.h> // atoi(),exit()
#include<math.h> // 数学函数头文件,包括floor(),ceil(),abs()等

#define ClearBiTree DestroyBiTree // 清空二叉树和销毁二叉树的操作一样

typedef struct BiTNode
{
int data; // 结点的值
BiTNode *lchild,*rchild; // 左右孩子指针
}BiTNode,*BiTree;

int Nil=0; // 设整型以0为空
void visit(int e)
{ printf("%d ",e); // 以整型格式输出
}
void InitBiTree(BiTree &T)
{ // 操作结果:构造空二叉树T
T=NULL;
}

void CreateBiTree(BiTree &T)
{ // 算法6.4:按先序次序输入二叉树中结点的值(可为字符型或整型,在主程中定义),
// 构造二叉链表表示的二叉树T。变量Nil表示空(子)树。修改
int number;
scanf("%d",&number); // 输入结点的值
if(number==Nil) // 结点的值为空
T=NULL;
else // 结点的值不为空
{ T=(BiTree)malloc(sizeof(BiTNode)); // 生成根结点
if(!T)
exit(OVERFLOW);
T->data=number; // 将值赋给T所指结点
CreateBiTree(T->lchild); // 递归构造左子树
CreateBiTree(T->rchild); // 递归构造右子树
}
}

void DestroyBiTree(BiTree &T)
{ // 初始条件:二叉树T存在。操作结果:销毁二叉树T
if(T) // 非空树
{ DestroyBiTree(T->lchild); // 递归销毁左子树,如无左子树,则不执行任何操作
DestroyBiTree(T->rchild); // 递归销毁右子树,如无右子树,则不执行任何操作
free(T); // 释放根结点
T=NULL; // 空指针赋0
}
}

void PreOrderTraverse(BiTree T,void(*Visit)(int))
{ // 初始条件:二叉树T存在,Visit是对结点操作的应用函数。修改算法6.1
// 操作结果:先序递归遍历T,对每个结点调用函数Visit一次且仅一次
if(T) // T不空
{ Visit(T->data); // 先访问根结点
PreOrderTraverse(T->lchild,Visit); // 再先序遍历左子树
PreOrderTraverse(T->rchild,Visit); // 最后先序遍历右子树
}
}

void InOrderTraverse(BiTree T,void(*Visit)(int))
{ // 初始条件:二叉树T存在,Visit是对结点操作的应用函数
// 操作结果:中序递归遍历T,对每个结点调用函数Visit一次且仅一次
if(T)
{ InOrderTraverse(T->lchild,Visit); // 先中序遍历左子树
Visit(T->data); // 再访问根结点
InOrderTraverse(T->rchild,Visit); // 最后中序遍历右子树
}
}

void PostOrderTraverse(BiTree T,void(*Visit)(int))
{ // 初始条件:二叉树T存在,Visit是对结点操作的应用函数
// 操作结果:后序递归遍历T,对每个结点调用函数Visit一次且仅一次
if(T) // T不空
{ PostOrderTraverse(T->lchild,Visit); // 先后序遍历左子树
PostOrderTraverse(T->rchild,Visit); // 再后序遍历右子树
Visit(T->data); // 最后访问根结点

}
}

void main()
{
BiTree T;
InitBiTree(T); // 初始化二叉树T
printf("按先序次序输入二叉树中结点的值,输入0表示节点为空,输入范例:1 2 0 0 3 0 0\n");
CreateBiTree(T); // 建立二叉树T
printf("先序递归遍历二叉树: ");
PreOrderTraverse(T,visit); // 先序递归遍历二叉树T
printf("\n中序递归遍历二叉树: ");
InOrderTraverse(T,visit); // 中序递归遍历二叉树T
printf(" \n后序递归遍历二叉树:");
PostOrderTraverse(T,visit); // 后序递归遍历二叉树T
printf("\n");
}

热点内容
欢太会员密码是什么 发布:2024-12-22 20:57:28 浏览:71
sqllocaldb 发布:2024-12-22 20:07:08 浏览:123
如何找到我的服务器 发布:2024-12-22 19:52:14 浏览:299
手挂机脚本游 发布:2024-12-22 19:38:00 浏览:429
层次原理图如何编译 发布:2024-12-22 19:27:17 浏览:371
android计算缓存大小 发布:2024-12-22 19:16:54 浏览:660
php访问模块 发布:2024-12-22 19:05:24 浏览:272
电梯IC加密 发布:2024-12-22 19:04:47 浏览:376
脚本圈是引流加粉吗 发布:2024-12-22 18:41:26 浏览:392
ajax文件上传表单提交 发布:2024-12-22 17:55:00 浏览:856