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

c语言先序遍历

发布时间: 2023-07-17 13:53:20

㈠ 数据结构用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语言数据结构树的前序遍历算法求指教

首先创建二叉树,个人喜欢用先序次序创建,如
int CreateBiTree(Tree *T)// 按先序次序输入二叉树中结点的值,'#'字符表示空树,构造二叉链表表示的二叉树T
{
char ch;
scanf("%c",&ch);
if (ch=='#') T = NULL;
else {
if (!(T = (Tree *)malloc(sizeof(Tree)))) return ERROR;
T->data=ch; // 生成根结点
CreateBiTree(T->lchild); // 构造左子树
CreateBiTree(T->rchild); // 构造右子树
}
return OK;
}
再者,调用前序遍历函数,再运用输出函数输出前序遍历的二叉树,如:
int Visit(int e ) // 输出元素e的值
{
printf("%c", e );
return OK;
}
int main()
{
Tree *T;
CreateBiTree(T); //调用按先序次序输入二叉树中结点的值(一个字符),构造二叉链
pre_order(T,Visit);//调用前序遍历二叉树算法
}

㈢ C语言前序遍历输入后序非递归遍历输出算法

//输入先序扩展序列:6500700
//后序遍历序列:576
//6
///
//57
////
//0000

//输入先序扩展序列:4210030050600
//后序遍历序列:132654
//
//4
///
//25
////
//1306
/////
//000000

#include<stdio.h>
#include<stdlib.h>
#definemax100//20//栈的大小
structbitree//二叉树的结构体
{
intdata;
structbitree*llink;//左分支
structbitree*rlink;//右分支
};

structstack_post//栈的结构体[用于后序遍历]
{
structbitree*bt;//指向二叉树
intleftOrRight;//当前节点是哪个分支,1=左分支0=右分支
};

structstack_postsk[max];//全局变量:栈(用于后序遍历)

//voidbuild(structbitree*n)
//创建二叉树:先序扩展序列+递归法
voidbuild(structbitree**n)
{
//注:structbitree**n是指针的指针
intch;
scanf("%d",&ch);
if(ch==0)
{
*n=NULL;
}
else
{
*n=(structbitree*)malloc(sizeof(structbitree));
if(*n==NULL)
{
printf(" Memoryoverflow! ");
exit(1);
}
(*n)->data=ch;
build(&((*n)->llink));
build(&((*n)->rlink));
}
//原代码
/*
n=(structbitree*)malloc(sizeof(structbitree));
scanf("%d",&ch);
if(ch==0)
n=NULL;
else
{
if(!(n=(structbitree*)malloc(sizeof(structbitree))))
{
return;
}
n->data=ch;
build(n->llink);
build(n->rlink);
}
*/
}

//后序遍历序列(非递归)
voidPost_Order(structbitree*n)
{
structbitree*p=NULL;
////structstack_postsk[max];//全局变量:栈(用于后序遍历)
inttop=0;//栈顶为0,top=1用于存放第1个数据
intleftOrRight;//当前节点是哪个分支,1=左分支0=右分支
structbitree*tmpTree;

if(n==NULL)return;
p=n;//当前二叉树的节点
leftOrRight=1;//1=左分支(默认从左分支开始遍历)
while(p!=NULL)
{
if(p->llink!=NULL)//有左分支,当前节点入栈
{
top++;
sk[top].bt=p;
sk[top].leftOrRight=leftOrRight;
p=p->llink;
leftOrRight=1;
}
elseif(p->rlink!=NULL)//有右分支,当前节点入栈
{
top++;
sk[top].bt=p;
sk[top].leftOrRight=leftOrRight;
p=p->rlink;
leftOrRight=0;
}
else//该节点是"叶子"
{
printf("%d",p->data);
while(1)//处于"回溯"状态
{
tmpTree=sk[top].bt;//看[栈顶]
if(tmpTree==NULL)//[栈]已经没有数据
{
p=NULL;//整个遍历过程结束,退出循环
break;
}
if(leftOrRight==1)//处于"左分支"回溯
{
if(tmpTree->rlink==NULL)//[栈顶]的节点没有右分支,出栈,打印
{
p=sk[top].bt;
leftOrRight=sk[top].leftOrRight;
top--;
printf("%d",p->data);
//仍然处于"回溯"状态
}
else//[栈顶]的节点有右分支,不出栈,右分支成为当前节点
{
p=tmpTree->rlink;
leftOrRight=0;//设置当前处于右分支
break;//退出"回溯"状态
}
}
else//处于"右分支"回溯
{
//[栈]有节点,出栈,打印
p=sk[top].bt;
leftOrRight=sk[top].leftOrRight;
top--;
printf("%d",p->data);
//仍然处于"回溯"状态
}
}//while(1)结束
}//if(p->llink!=NULL)else结束
}//while(p!=NULL)结束

//栈顶top=0,说明[栈]已经没有数据
printf(" 核对,栈顶top=%d ",top);
}

//有错误
//原代码,后序遍历序列(非递归)
/*
voidpostorder(structbitree*n)
{
structbitree*p,*q;
inti;
p=(structbitree*)malloc(sizeof(structbitree));
p=n;
q=(structbitree*)malloc(sizeof(structbitree));
structbitree*s[max];
for(i=0;i<max;i++)
{
s[i]=(structbitree*)malloc(sizeof(structbitree));
}
inttop=-1;
do
{
while(p!=NULL)
{
if(p->rlink!=NULL)
{
top++;
s[top]=p->rlink;
}
p=p->llink;;
}
p=s[top];
top--;
if(p->rlink==NULL||p->rlink==q)
{
printf("%d",p->data);
q=p;
p=NULL;
}
else
p=p->rlink;
}while(p!=NULL||top!=-1);
}
*/

//后序遍历序列(递归)[用于对比测试]
voidpostTest(structbitree*n)
{
if(n!=NULL)
{
postTest(n->llink);
postTest(n->rlink);
printf("%d",n->data);
}
}

intmain()
{
structbitree*n;
//原代码n=(structbitree*)malloc(sizeof(structbitree));
printf("Inputthepreorder-numbersofthetree('0'forNULL): ");
//原代码build(n);
build(&n);

printf(" Postorderisbelow:");
//原代码postorder(n);//后序遍历序列(非递归)
Post_Order(n);//后序遍历序列(非递归)

printf(" 后序遍历序列(递归):");
postTest(n);//用于对比测试

printf(" ");
return0;
}

㈣ 二叉树先序遍历算法流程图怎么画,学的是数据结构c语言。

在计算机软件专业中,数据结构、以及 C 语言这两门课程是非常重要的两门课程。最为重要的是:如果将来想做计算机软件开发工作的话,那么对 C 语言中的指针编程、以及递归的概念是必须要熟练精通掌握的,因为它和数据结构课程中的链表、二叉树等内容的关系实在是太紧密了。但是这个编程技能必须要依靠自己多上机实践才能够真正彻底掌握的。
首先要搞明白二叉树的几种遍历方法:(1)、先序遍历法:根左右;(2)、中序遍历法:左根右;(3)、后序遍历法:左右根。其中根:表示根节点;左:表示左子树;右:表示右子树。
至于谈到如何画先序遍历的流程图,可以这样考虑:按照递归的算法进行遍历一棵二叉树。

程序首先访问根节点,如果根节点的值为空(NULL),则停止访问;如果根节点的值非空,则递归访问二叉树的左子树(left),然后是依然判断二叉树下面的左子树下面的根节点是否为空(NULL),如果根节点的值为空(NULL),则返回上一层,再访问二叉树的右子树(right)。依此类推。

㈤ 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()函数
你没写!!
我只是改了语法错误!!
只剩那一个函数没定义
你定义下就没语法错误了!

热点内容
双向的访问了你的空间 发布:2025-02-08 13:13:20 浏览:699
python元素是否在list 发布:2025-02-08 13:11:38 浏览:694
安卓现在哪个最好用 发布:2025-02-08 13:06:27 浏览:790
百度网盘上传错误 发布:2025-02-08 12:56:21 浏览:69
安卓手机怎么解除防抖系统 发布:2025-02-08 12:55:37 浏览:391
sql2008sql代理 发布:2025-02-08 12:55:34 浏览:52
vs编译找不到指定项目文件 发布:2025-02-08 12:36:54 浏览:243
怎样用windows服务器搭建网站 发布:2025-02-08 12:27:38 浏览:532
android获取音乐 发布:2025-02-08 12:26:05 浏览:962
存储的数据可以复制吗 发布:2025-02-08 12:20:22 浏览:852