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

输入一组数据,用先序,中序,后序访问后输出,用汇编实现,麻烦高手给个答案,或者给个详细的思路也可,不胜感激o(∩_∩)o...
是8086,16位的,二楼的仁兄给的是C语言的呀,哭
我已经找到份程序了,麻烦哪位高手帮我填下注释呀,因为小弟水平有限,麻烦帮我把每一行都尽量写上注释呀,小弟愿将所有分数奉上^_^

;--------------------插入子树的子程序-------------------------------------
ASK_CHILD PROC NEAR
PUSH CX
PUSH BX
MOV AH,01H
INT 21H
CALL CRIF
CMP AL,0DH
JE BACK_06
ADD SI,CX
MOV [SI],AL
SUB SI,CX
SHL CX,1
MOV BL,AL
CMP CX,31
JA BACK_06
MOV DL,BL
MOV AH,02H
INT 21H

MOV AH,09H
MOV DX,OFFSET MESSAGE_02
INT 21H
CALL ASK_CHILD
ADD CX,1
MOV DL,BL
MOV AH,02H
INT 21H

MOV AH,09H
MOV DX,OFFSET MESSAGE_03
INT 21H
CALL ASK_CHILD
BACK_06:
POP BX
POP CX
RET
ASK_CHILD ENDP

#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

}

参考资料:找来的,你看看吧!

温馨提示:内容为网友见解,仅供参考
第1个回答  2008-05-01
您问也要说明白啊?是什么汇编?X86的?51的?96的?还是别的,十六位?八位?32位?

用汇编实现二叉树的先序,中序,后序遍历
}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<<"m...

编写程序,用先序递归遍历法建立二叉树的二叉链表存储结构,输出其先序...
include "stdio.h"include "malloc.h"define ELEMTYPE char BiTNode *bulid() \/*建树*\/ { BiTNode *q;BiTNode *s[20];int i,j;char x;printf("请按顺序输入二叉树的结点以输入0和*号结束\\n");printf("请输入要输入的为第几个结点i=\\n");scanf("%d",&i);printf("请输入你要输入该结...

建立二叉树,层序、先序、中序、后序遍历( 用递归或非递归的方法都需要...
Preorder(T->lchild); \/\/先序遍历左子树 Preorder(T->rchild); \/\/先序遍历右子树 } } \/\/===LNR 中序遍历=== void Inorder(BinTree T){ if(T) { Inorder(T->lchild); \/\/中序遍历左子树 printf("%c",T->data); \/\/访问结点 Inorder(T->rchild); \/\/中序遍历...

...建立二叉树的存储结构,先序、中序、后序遍历二叉树(要求任选某一种...
后序遍历二叉树(要求任选某一种用非递归算法完成); 3、查询二叉树中指定结点;

二叉树的中序、前序、后序的递归、非递归遍历算法,层次序的非递归遍历...
createbintree(&(*t)->lchild);\/\/递归实现左孩子的建立 createbintree(&(*t)->rchild);\/\/递归实现右孩子的建立 } } \/\/二叉树前序遍历递归实现 void preorder(bintree t)\/\/t是指针变量,而不是结点结构体变量 {if(t){ cout<<t->data<<" ";preorder(t->lchild);preorder(t->rchild...

一棵二叉树的先序遍历序列为ABCDEF,中序遍历序列为CBAEDF,则后序遍历...
先序列号为这个,那么在编辑的时候,可以先进行用顺序的方式,然后再进行。后序序列是CBA。根据前序,可以确定A为根,A在中序中的位置,可以确定CB为A的左子树上的结点,没有右子树。确定A之后,再看中序第二值为B,查看B在中序中的位置,C在B左边,确定C为B的左子树。

在二叉树结点的先序序列、中序序列和后序序列中,所有叶子结点的先后顺序...
先序遍历的顺序是根节点-左子树-右子树,中序遍历的顺序是左子树-根节点-右子树,后序遍历的顺序是左子树-右子树-根节点。虽然这三种遍历方式的顺序有所不同,但叶子节点的顺序在所有遍历方式中都是一致的。这个性质对于二叉树的遍历和操作非常重要,因为它允许我们在不依赖于遍历方式的情况下,对叶子...

...完成二叉树的建立,先序中序后序遍历的操作,求所有叶子结点总数_百度...
Tree;printf("input 根节点: ");create(&Tree);printf("先序遍历:");print1(Tree);printf("中序遍历");print2(Tree);printf("后序遍历");print3(Tree);printf("\\n深 度:%d \\n",depth(Tree));printf("总结点数:%d \\n",Cnode(Tree));printf("叶子结点数:%d\\n",leaf);} ...

在一棵二叉树的前序遍历、中序遍历、后序遍历所产生的序列中,所有叶结...
【答案】:B B.【解析】对二叉树的访问有3种方式,其中任意的两种可唯一确定一颗二叉树,但无论是前序、后序还是中序遍历二叉树时,其区别在于访问根的先后次序不同,而访问叶结点的顺序完全相同。

一颗二叉树的先序遍历结果和中序遍历结果分别是ABDECFG、DBEAFGC...
先序遍历中的第一个字母A就是二叉树的根结点,A,在中序遍历中找到A,他的左侧有三个字母DBE就是它的左子树的中序遍历,然后再先序便利中同样找到A后面的三个字母BDE,就是根结点的左子树的先序遍历。用同样的方法找出根结点的右子树的前序遍历和中序遍历,然后递归使用前面的方法就可以画出整个...

相似回答