用汇编实现二叉树的先序,中序,后序遍历

作者&投稿:辉临 (若有异议请与网页底部的电邮联系)
用汇编实现二叉树的先序,中序,后序遍历~

#include
"iostream.h"
#include
"stdlib.h"
#include
"stdio.h"
typedef
char
ElemType;//定义二叉树结点值的类型为字符型
const
int
MaxLength=10;//结点个数不超过10个
typedef
struct
BTNode{
ElemType
data;
struct
BTNode
*lchild,*rchild;
}BTNode,*
BiTree;
void
CreateBiTree(BiTree
&T){//按先序次序输入,构造二叉链表表示的二叉树T,空格表示空树
//
if(T)
return;
char
ch;
ch=getchar();
//不能用cin来输入,在cin中不能识别空格。
if(ch=='
')
T=NULL;
else{
if(!(T=(BTNode
*)malloc(sizeof(BTNode))))
cout<<"malloc
fail!";
T->data=ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
void
PreOrderTraverse(BiTree
T){//先序遍历
if(T){
cout<
data<<'
';
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
void
InOrderTraverse(BiTree
T){//中序遍历
if(T){
InOrderTraverse(T->lchild);
cout<
data<<'
';
InOrderTraverse(T->rchild);
}
}
void
PostOrderTraverse(BiTree
T){//后序遍历
if(T){
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
cout<
data<<'
';
}
}
void
LevelOrderTraverse(BiTree
T){//层序遍历
BiTree
Q[MaxLength];
int
front=0,rear=0;
BiTree
p;
if(T){
//根结点入队
Q[rear]=T;
rear=(rear+1)%MaxLength;
}
while(front!=rear){
p=Q[front];
//队头元素出队
front=(front+1)%MaxLength;
cout<
data<<'
';
if(p->lchild){
//左孩子不为空,入队
Q[rear]=p->lchild;
rear=(rear+1)%MaxLength;
}
if(p->rchild){
//右孩子不为空,入队
Q[rear]=p->rchild;
rear=(rear+1)%MaxLength;
}
}
}
//非递归的先序遍历算法
void
NRPreOrder(BiTree
bt)
{
BiTree
stack[MaxLength],p;
int
top;
if
(bt!=NULL){
top=0;p=bt;
while(p!=NULL||top>0)
{
while(p!=NULL)
{
cout<
data;
stack[top]=p;
top++;
p=p->lchild;
}
if
(top>0)
{
top--;
p=stack[top];
p=p->rchild;
}
}
}
}
//非递归的中序遍历算法
void
NRInOrder(BiTree
bt)
{
BiTree
stack[MaxLength],p;
int
top;
if
(bt!=NULL){
top=0;p=bt;
while(p!=NULL||top>0)
{
while(p!=NULL)
{
stack[top]=p;
top++;
p=p->lchild;
}
if
(top>0)
{
top--;
p=stack[top];cout<
data;
p=p->rchild;
}
}
}
}
//非递归的后序遍历算法
/*bt是要遍历树的根指针,后序遍历要求在遍历完左右子树后,再访问根。
需要判断根结点的左右子树是否均遍历过。
可采用标记法,结点入栈时,配一个标志tag一同入栈
(1:遍历左子树前的现场保护,2:遍历右子树前的现场保护)。
首先将bt和tag(为1)入栈,遍历左子树;
返回后,修改栈顶tag为2,遍历右子树;最后访问根结点。*/
typedef
struct
{
BiTree
ptr;
int
tag;
}stacknode;
void
NRPostOrder(BiTree
bt)
{
stacknode
s[MaxLength],x;
BiTree
p=bt;
int
top;
if(bt!=NULL){
top=0;p=bt;
do
{
while
(p!=NULL)
//遍历左子树
{
s[top].ptr
=
p;
s[top].tag
=
1;
//标记为左子树
top++;
p=p->lchild;
}
while
(top>0
&&
s[top-1].tag==2)
{
x
=
s[--top];
p
=
x.ptr;
cout<
data;
//tag为R,表示右子树访问完毕,故访问根结点
}
if
(top>0)
{
s[top-1].tag
=2;
//遍历右子树
p=s[top-1].ptr->rchild;
}
}while
(top>0);}
}//PostOrderUnrec
int
BTDepth(BiTree
T){//求二叉树的深度
if(!T)
return
0;
else{
int
h1=BTDepth(T->lchild);
int
h2=BTDepth(T->rchild);
if(h1>h2)
return
h1+1;
else
return
h2+1;
}
}
int
Leaf(BiTree
T){//求二叉树的叶子数
if(!T)
return
0;
else
if(!T->lchild&&!T->rchild)
return
1;
else
return(Leaf(T->lchild)+Leaf(T->rchild));
}
int
NodeCount(BiTree
T){//求二叉树的结点总数
if(!T)
return
0;
else
return
NodeCount(T->lchild)+NodeCount(T->rchild)+1;
}
void
main(){
BiTree
T;
T=NULL;
int
select;
//cout<<"请按先序次序输入各结点的值,以空格表示空树(输入时可连续输入):"<
>select;
switch(select){
case
0:return;
case
1:
cout<<"请按先序次序输入各结点的值,以空格表示空树(输入时可连续输入):"<
评论
0
0
0
加载更多

#includenbsp;“iostream.h“#includenbsp;“stdlib.h“#includenbsp;“stdio.h“typedefnbsp;charnbsp;ElemType;//定义二叉树结点值的类型为字符型constnbsp;intnbsp;MaxLength=10;//结点个数不超过10个typedefnbsp;structnbsp;BTNode{ElemTypenbsp;data;structnbsp;BTNodenbsp;*lchild,*rchild;}BTNode,*nbsp;BiTree;voidnbsp;CreateBiTree(BiTreenbsp;amp;T){//按先序次序输入,构造二叉链表表示的二叉树T,空格表示空树//nbsp;if(T)nbsp;return;charnbsp;ch;ch=getchar();nbsp;//不能用cin来输入,在cin中不能识别空格。if(ch==‘nbsp;‘)nbsp;T=NULL;else{if(!(T=(BTNodenbsp;*)malloc(sizeof(BTNode))))nbsp;coutamp;lt;amp;lt;“mallocnbsp;fail!“;T-amp;gt;data=ch;CreateBiTree(T-amp;gt;lchild);CreateBiTree(T-amp;gt;rchild);}}voidnbsp;PreOrderTraverse(BiTreenbsp;T){//先序遍历if(T){coutamp;lt;amp;lt;T-amp;gt;dataamp;lt;amp;lt;‘nbsp;‘;PreOrderTraverse(T-amp;gt;lchild);PreOrderTraverse(T-amp;gt;rchild);}}voidnbsp;InOrderTraverse(BiTreenbsp;T){//中序遍历if(T){InOrderTraverse(T-amp;gt;lchild);coutamp;lt;amp;lt;T-amp;gt;dataamp;lt;amp;lt;‘nbsp;‘;InOrderTraverse(T-amp;gt;rchild);}}voidnbsp;PostOrderTraverse(BiTreenbsp;T){//后序遍历if(T){PostOrderTraverse(T-amp;gt;lchild);PostOrderTraverse(T-amp;gt;rchild);coutamp;lt;amp;lt;T-amp;gt;dataamp;lt;amp;lt;‘nbsp;‘;}}voidnbsp;LevelOrderTraverse(BiTreenbsp;T){//层序遍历BiTreenbsp;Q[MaxLength];intnbsp;front=0,rear=0;BiTreenbsp;p;if(T){nbsp;//根结点入队Q[rear]=T;rear=(rear+1)%MaxLength;}while(front!=rear){p=Q[front];nbsp;//队头元素出队front=(front+1)%MaxLength;coutamp;lt;amp;lt;p-amp;gt;dataamp;lt;amp;lt;‘nbsp;‘;if(p-amp;gt;lchild){nbsp;//左孩子不为空,入队Q[rear]=p-amp;gt;lchild;rear=(rear+1)%MaxLength;}if(p-amp;gt;rchild){nbsp;//右孩子不为空,入队Q[rear]=p-amp;gt;rchild;rear=(rear+1)%MaxLength;}}}//非递归的先序遍历算法voidnbsp;NRPreOrder(BiTreenbsp;bt){nbsp;BiTreenbsp;stack[MaxLength],p;intnbsp;top;ifnbsp;(bt!=NULL){top=0;p=bt;while(p!=NULL||topamp;gt;0){nbsp;while(p!=NULL){coutamp;lt;amp;lt;p-amp;gt;data;stack[top]=p;top++;p=p-amp;gt;lchild;}ifnbsp;(topamp;gt;0){nbsp;top--;nbsp;p=stack[top];nbsp;p=p-amp;gt;rchild;nbsp;}}}}//非递归的中序遍历算法voidnbsp;NRInOrder(BiTreenbsp;bt){nbsp;BiTreenbsp;stack[MaxLength],p;intnbsp;top;ifnbsp;(bt!=NULL){top=0;p=bt;while(p!=NULL||topamp;gt;0){nbsp;while(p!=NUL

#include "iostream.h"
#include "stdlib.h"
#include "stdio.h"

typedef char ElemType;//定义二叉树结点值的类型为字符型
const int MaxLength=10;//结点个数不超过10个

typedef struct BTNode{
ElemType data;
struct BTNode *lchild,*rchild;
}BTNode,* BiTree;

void CreateBiTree(BiTree &T){//按先序次序输入,构造二叉链表表示的二叉树T,空格表示空树
// if(T) return;
char ch;
ch=getchar(); //不能用cin来输入,在cin中不能识别空格。
if(ch==' ') T=NULL;
else{
if(!(T=(BTNode *)malloc(sizeof(BTNode)))) cout<<"malloc fail!";
T->data=ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}

void PreOrderTraverse(BiTree T){//先序遍历
if(T){
cout<<T->data<<' ';
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
void InOrderTraverse(BiTree T){//中序遍历
if(T){
InOrderTraverse(T->lchild);
cout<<T->data<<' ';
InOrderTraverse(T->rchild);
}
}
void PostOrderTraverse(BiTree T){//后序遍历
if(T){
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
cout<<T->data<<' ';
}
}
void LevelOrderTraverse(BiTree T){//层序遍历

BiTree Q[MaxLength];
int front=0,rear=0;
BiTree p;
if(T){ //根结点入队
Q[rear]=T;
rear=(rear+1)%MaxLength;
}
while(front!=rear){
p=Q[front]; //队头元素出队
front=(front+1)%MaxLength;
cout<<p->data<<' ';
if(p->lchild){ //左孩子不为空,入队
Q[rear]=p->lchild;
rear=(rear+1)%MaxLength;
}
if(p->rchild){ //右孩子不为空,入队
Q[rear]=p->rchild;
rear=(rear+1)%MaxLength;
}
}

}
//非递归的先序遍历算法
void NRPreOrder(BiTree bt)
{ BiTree stack[MaxLength],p;
int top;
if (bt!=NULL){
top=0;p=bt;
while(p!=NULL||top>0)
{ while(p!=NULL)
{
cout<<p->data;
stack[top]=p;
top++;
p=p->lchild;
}
if (top>0)
{ top--; p=stack[top]; p=p->rchild; }
}
}
}
//非递归的中序遍历算法
void NRInOrder(BiTree bt)
{ BiTree stack[MaxLength],p;
int top;
if (bt!=NULL){
top=0;p=bt;
while(p!=NULL||top>0)
{ while(p!=NULL)
{

stack[top]=p;
top++;
p=p->lchild;
}
if (top>0)
{ top--; p=stack[top];cout<<p->data; p=p->rchild; }
}
}
}
//非递归的后序遍历算法
/*bt是要遍历树的根指针,后序遍历要求在遍历完左右子树后,再访问根。
需要判断根结点的左右子树是否均遍历过。
可采用标记法,结点入栈时,配一个标志tag一同入栈
(1:遍历左子树前的现场保护,2:遍历右子树前的现场保护)。
首先将bt和tag(为1)入栈,遍历左子树;
返回后,修改栈顶tag为2,遍历右子树;最后访问根结点。*/

typedef struct
{
BiTree ptr;
int tag;
}stacknode;

void NRPostOrder(BiTree bt)
{
stacknode s[MaxLength],x;
BiTree p=bt;
int top;
if(bt!=NULL){
top=0;p=bt;
do
{
while (p!=NULL) //遍历左子树
{
s[top].ptr = p;
s[top].tag = 1; //标记为左子树
top++;
p=p->lchild;
}

while (top>0 && s[top-1].tag==2)
{
x = s[--top];
p = x.ptr;
cout<<p->data; //tag为R,表示右子树访问完毕,故访问根结点
}

if (top>0)
{
s[top-1].tag =2; //遍历右子树
p=s[top-1].ptr->rchild;
}
}while (top>0);}
}//PostOrderUnrec

int BTDepth(BiTree T){//求二叉树的深度
if(!T) return 0;
else{
int h1=BTDepth(T->lchild);
int h2=BTDepth(T->rchild);
if(h1>h2) return h1+1;
else return h2+1;
}
}

int Leaf(BiTree T){//求二叉树的叶子数
if(!T) return 0;
else if(!T->lchild&&!T->rchild) return 1;
else return(Leaf(T->lchild)+Leaf(T->rchild));
}

int NodeCount(BiTree T){//求二叉树的结点总数
if(!T) return 0;
else return NodeCount(T->lchild)+NodeCount(T->rchild)+1;
}

void main(){
BiTree T;
T=NULL;
int select;
//cout<<"请按先序次序输入各结点的值,以空格表示空树(输入时可连续输入):"<<endl;
// CreateBiTree(T);
while(1){
cout<<"\n\n请选择要执行的操作:\n";
cout<<"1.创建二叉树\n";
cout<<"2.二叉树的递归遍历算法(前、中、后)\n";
cout<<"3.二叉树的层次遍历算法\n";
cout<<"4.求二叉树的深度\n";
cout<<"5.求二叉树的叶子结点\n";
cout<<"6.求二叉树的结点总数\n";
cout<<"7.二叉树的非递归遍历算法(前、中、后)\n"; //此项可选做
cout<<"0.退出\n";
cin>>select;
switch(select){
case 0:return;
case 1:
cout<<"请按先序次序输入各结点的值,以空格表示空树(输入时可连续输入):"<<endl;
CreateBiTree(T);
break;
case 2:
if(!T) cout<<"未建立树,请先建树!";
else{
cout<<"\n先序遍历:\n";
PreOrderTraverse(T);
cout<<"\n中序遍历:\n";
InOrderTraverse(T);
cout<<"\n后序遍历:\n";
PostOrderTraverse(T);
}
break;
case 3:
cout<<"\n层序遍历:\n";
LevelOrderTraverse(T);
break;
case 4:
cout<<"二叉树的深度为:\n";
cout<<BTDepth(T);
break;
case 5:
cout<<"\n叶子节点数:\n";
cout<<Leaf(T);
break;
case 6:
cout<<"总节点数:\n";
cout<<NodeCount(T);
break;
case 7:
if(!T) cout<<"未建立树,请先建树!";
else{
cout<<"\n先序遍历:\n";
NRPreOrder(T);
cout<<"\n中序遍历:\n";
NRInOrder(T);
cout<<"\n后序遍历:\n";
NRPostOrder(T);
}
break;
default:
cout<<"请确认选择项:\n";
}//end switch
}//end while

}

您问也要说明白啊?是什么汇编?X86的?51的?96的?还是别的,十六位?八位?32位?


用汇编实现二叉树的先序,中序,后序遍历
ElemType;\/\/定义二叉树结点值的类型为字符型 const int MaxLength=10;\/\/结点个数不超过10个 typedef struct BTNode{ ElemType data;struct BTNode lchild,*rchild;}BTNode,BiTree;void CreateBiTree(BiTree &T){\/\/按先序次序输入,构造二叉链表表示的二叉树T,空格表示空树 \/\/ if(T)return;char c...

已知二叉树的先序序列,怎么建立二叉树并求其叶子结点和深度???~_百度...
二叉树的建立与遍历 Time Limit: 1000MS Memory limit: 65536K 题目描述 已知一个按先序序列输入的字符序列,如abc,,de,g,,f,,,(其中逗号表示空节点)。请建立二叉树并按中序和后序方式遍历二叉树,最后求出叶子节点个数和二叉树深度。 输入 输入一个... 展开 kate...

设二叉树的存储结构为二叉链表,编写有关二叉树的递归算法:
(1)统计二叉树中度为1的结点个数。(2)统计二叉树中度为2的结点个数。(3)统计二叉树中度为0(叶结点)的结点个数。(4)统计二叉树的高度。(5)统计二叉树的宽度,即在二叉树的各层上,具有结点数最多的那一层上的结点总数。(6)从二叉树中删... 展开 972630969 | 浏览2043 次 |举报 我有更好的答案推荐...

汇编的排序算法
第二趟结束,在倒数第二个数中得到一个新的最小数。如此下去,直至最 终完成排序。由于在排序过程中总是大数往前放,小数往后放,相当于气泡往上升,所 以称作冒泡排序。用二重循环实现,外循环变量设为i,内循环变量设为j。外循环重复9次 ,内循环依次重复9,8,...,1次。每次进行比较的两个元...

如何学习编程?
技术就是一层窗户纸,是有道理可以遵循的,在我看来,比搞抽象的艺术要容易。从零开始学编程,第一关就是要选择你所要学习的编程语言。尽量避免选择过于冷门的编程语言,最好在比较常用的编程语言中挑选一个,像java、c、vb等等。选择一本编程的入门书籍,它应该是比较详细地介绍该门编程语言的知识点...

计算机专业有哪些课程?
主要课程有计算机应用基础、应用文写作、数学、英语、德育、电工与电子技术、计算机网络技术、C语言、计算机组装与维修、企业网安全高级技术、企业网综合管理、windows server 2008操作系统。还有局域网组建、Linux服务器操作系统、网络设备与网络技术(主要学习思科、华为公司设备的配置、管理、调试)、SQL Server...

学计算机需要学什么
哈夫曼树的定义、性质、存贮结构及建立过程,二叉树的先序、中序和后序遍历算法, 二叉 排序树的查找、插入和生成算法,图的定义,图的邻接矩阵、邻接表和边集数组存贮 结构, 图的深度优先和广度优先遍历算法,求图的最小生成树和最短路径算法,拓扑排序 算法,数 据查找和排序的各种算法,文件的概念和组织方法等。

汇编语言程序设计(任选两道题)
我有个成绩统计程序的设计 需要的话找【78219960】

怎么学习编程?
1.明确学习目的 学习编程对大多数IT业人员来说都是非常有用的。学编程,做一名编程人员,从个人角度讲,可以解决在软件使用中所遇到的问题,改进现有软件,可以为自己找到一份理想的工作添加重要得砝码,有利于在求职道路上谋得一个好的职位;从国家的角度,可以为中国的软件产业做出应有的贡献,一名优秀的程序...

急求09年或者历年广西计算机二级考试的真题和答案
A) 栈是“先进先出”的线性表 B) 队列是“先进先出”的线性表 C) 循环队列是非线性结构 D) 有序性表既可以采用顺序存储结构,也可以采用链式存储结构 (2)支持子程序调用的数据结构是 A) 栈 B) 树 C) 队列 D)二叉树 (3)某二叉树有5个度为2的结点,则该二叉树中的叶...

高邮市19171009510: 用汇编实现二叉树的先序,中序,后序遍历
衡浅重组: #includenbsp;“iostream.h“#includenbsp;“stdlib.h“#includenbsp;“stdio.h“typedefnbsp;charnbsp;ElemType;//定义二叉树结点值的类型为字符型constnbsp;intnbsp;MaxLength=10;//结点个数不超过10个typedefnbsp;structnbsp;BTNode{...

高邮市19171009510: 用汇编实现二叉树的先序,中序,后序遍历 -
衡浅重组: #include "iostream.h"#include "stdlib.h"#include "stdio.h" typedef char ElemType;//定义二叉树结点值的类型为字符型 const int MaxLength=10;//结点个数不超过10个 typedef struct BTNode{ ElemType data; struct BTNode *lchild,*rchild; }...

高邮市19171009510: 编写一个程序实现二叉树的先序中序后序遍历 -
衡浅重组: void prvorder(bitree * t){ //前序遍历 if (t!=Null){ printf("%4d",t->data); prvorder(t->lchild); prvorder(t->rchild); } } void PreOrderUnrec(bitree *t) //先序遍历非递归算法; { bitree *p = t,*Stack[M]; int top = -1; while (p != Null || top != -1) { while (p!=Null) //...

高邮市19171009510: 建立一个二叉树实现二叉树的先序中序后序和遍历. -
衡浅重组: #include <stdio.h> #define N 100 typedef struct node { char data; struct node *lchild,*rchild; }BTNode; /*---二叉树的建立---*/ BTNode *createbintree() { BTNode *t; char x; scanf("%c",&x); if (x=='#') t=NULL; else { t=(BTNode *)malloc(sizeof(...

高邮市19171009510: 请教一下数据结构二叉树的先序遍历中序遍历后序遍历是怎么弄的 -
衡浅重组: 所谓先序、中序和后序的区别在于访问根的时机,分别是BLR、LBR和LRB,其中B、L、R分别表示根结点、根结点的左子树和根结点的右子树. 以后序遍历为例进行讲解. 后序遍历算法: (1)后序遍历根结点的左子树; (2)后序遍历根结...

高邮市19171009510: 建立二叉树,并实现先序中序后序,用递归算法 -
衡浅重组: #include#include typedef char TElemType; typedef struct BiTNode{ TElemType data; /*二叉树数据域*/ struct BiTNode *lchild, *rchild;/* 左右孩子指针*/ }BiTNode, *BiTree;/*二叉树的二叉链表存储表示*/ BiTree CreateBiTree(void)/*按先序次序输...

高邮市19171009510: 构造一棵二叉树,并分别输出其先序遍历、中序遍历和后序遍历的结果 -
衡浅重组: #include<iostream> using namespace std; typedef struct BinaryTree { char data; struct BinaryTree *lchild,*rchild; }BinaryTree,*BiTree; void CreateBiTree(BiTree &T) { char z; if((z=getchar())==' ') T=NULL; else { T=(BinaryTree*)malloc(sizeof(...

高邮市19171009510: 编写程序 实现对建立的二叉树进行后序遍历,并输出遍历结果.二叉树用二叉链表存储结构存储 -
衡浅重组: void search(TreeNode t)//递归后序遍历二叉树 { search(t.leftchild);//遍历节点左子树 search(t.rightchild);//遍历节点右子树 printf(t.data);//打印当前节点 } 差不多就这个意思吧

高邮市19171009510: 输入两个字符串,分别是一颗二叉树的中序和后序,编程输出其先序.(Pascal) -
衡浅重组: program qiuqianxu; var s1,s2,s:string; procedure sou(s1,s2:string); var t,k,l:longint; c:char; begin c:=s2[length(s2)]; {后序排列的尾是先序排列的头} for t:=1 to length(s1) do if s1[t]=c then break; write(c); if t>1 then sou(copy(s1,1,t-1),copy(s2,1,t-1)); ...

高邮市19171009510: 先序中序建立二叉树
衡浅重组: #include<stdio.h> #include<stdlib.h> #define size 100 typedef struct node//定义结点 { char data; struct node *lchild,*rchild; } JD,*BitTree; int search(char ino[],char pre)//在中序序列中查找先序中该元素所在位置 { int i=0; while(ino[i]!=pre&&ino[i]) i++; ...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网