首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 怎样用堆栈实现二叉树 [已结贴,结贴人:Cyrosly]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Cyrosly
    • 等级:
    发表于:2008-06-13 23:30:13 楼主
      不知道那本书对用堆栈实现二叉树有比较详细的描述.网上这方面的资料很少啊,买了些数据结构的书,而且都是老外的,结果不是没有就是一笔带过主要都是讲递归实现(我就怀疑作者是否会).如果可能最好将供代码帖出来(包括创建和遍历).谢谢
    100  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-13 23:35:521楼 得分:8
    堆栈实现二叉树?
    堆栈?到底是堆还是栈。
    堆本身就是一个完全二叉树。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Cyrosly
    • 等级:
    发表于:2008-06-13 23:38:362楼 得分:0
    stack
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Cyrosly
    • 等级:
    发表于:2008-06-13 23:41:143楼 得分:0
    习惯上将CPU的运行时栈称为堆栈,而stack模拟二叉树实际上是模拟运行时栈,所以就习惯说堆栈了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • iu_81
    • 等级:
    发表于:2008-06-13 23:44:154楼 得分:45
    C/C++ code
    //BiTree.h struct BiTNode //采用二叉链表存储结构 { char data; struct BiTNode* lchild; struct BiTNode* rchild; }BiTNode; struct BiTNode* CreateBiTree(); int DestroyBiTree(struct BiTNode* T); int visit(char elem); //递归遍历算法 int PreOrderTraverse_R(struct BiTNode* T, int (*visit)(char elem)); int InOrderTraverse_R(struct BiTNode* T, int (*visit)(char elem)); int PostOrderTraverse_R(struct BiTNode* T, int (*visit)(char elem)); //非递归遍历算法 void PreOrderTraverse(struct BiTNode* T, int (*visit)(char elem)); void InOrderTraverse(struct BiTNode* T, int (*visit)(char elem)); void PostOrderTraverse(struct BiTNode* T, int (*visit)(char elem)); //stack.h 堆栈数据结构,用于非递归算法中的附加空间 #define STACK_SIZE 256 struct stack { struct BiTNode* elem[STACK_SIZE]; int top; //top总是指向栈顶元素的上一个元素 int bottom; //恒0 }; void initStack(struct stack* s); struct BiTNode* getTop(struct stack* s); struct BiTNode* pop(struct stack* s); void push(struct stack* s,struct BiTNode* p); int isEmpty(struct stack* s); //stack.c 堆栈的实现 #include<stdio.h> #include<string.h> #include "stack.h" //初始化堆栈为0,栈指针为0 void initStack(struct stack* s) { memset(s->elem,0,STACK_SIZE); s->top = s->bottom = 0; } //获取栈顶元素,栈顶指针不变 struct BiTNode* getTop(struct stack* s) { return s->elem[s->top-1]; } //弹出&返回栈顶元素 struct BiTNode* pop(struct stack* s) { if(s->top == s->bottom) //若栈空 { printf("Stack is empty!\n"); return 0; } --s->top; return s->elem[s->top]; } //将pB指针压入栈中 void push(struct stack* s,struct BiTNode* pB) { if(s->top<STACK_SIZE) //栈未满 { s->elem[s->top] = pB; ++s->top; } else printf("Stack is full!\n"); } //判断栈是否为空,空返回非0 int isEmpty(struct stack* s) { return s->top == s->bottom; } //BiTree.c 二叉树创建、销毁、递归算法实现 #include<stdio.h> #include<malloc.h> #include "BiTree.h" #include "stack.h" struct BiTNode* CreateBiTree() //采用先序递归方法创建一棵二叉树 { struct BiTNode* T; char ch,tmp; printf("please input the value of the node:\n"); scanf("%c",&ch); tmp = getchar(); //忽略回车符 if(ch == ''&'') //输入&符号表示此节点为空 { printf("Null BiTreeNode Created!\n"); T = NULL; return NULL; } T = (struct BiTNode *)malloc(sizeof(BiTNode)); //为当前节点分配内存 if(!T) { printf("Allocate memory failed!\n"); return NULL; } T->data = ch; //为当前节点赋值 T->lchild = CreateBiTree(); //递归创建左子树 T->rchild = CreateBiTree(); //递归创建右子树 return T; } //销毁二叉树,销毁成功返回0,错误返回1 int DestroyBiTree(struct BiTNode* T) { if(T) { struct BiTNode* lchild = T->lchild; struct BiTNode* rchild = T->rchild; free(T); if(0 == DestroyBiTree(lchild)) { if(0 == DestroyBiTree(rchild)) return 0; else return 1; } } return 0; } //访问节点元素 int visit(char elem) { if(elem == ''&'') return 1; printf("%c ",elem); return 0; } //先序遍历递归算法,返回值为0表示遍历成功,1为失败 int PreOrderTraverse_R(struct BiTNode* T, int (*visit)(char elem)) { if(T) { if(0 != visit(T->data)) //访问根节点 return 1; if(T->lchild) { if(0 != InOrderTraverse_R(T->lchild,visit)) //递归遍历左子树 return 1; } if(T->rchild) { if(0 != InOrderTraverse_R(T->rchild,visit)) //递归遍历右子树 return 1; } } return 0; } //中序遍历递归算法,返回值为0表示遍历成功,1为失败 int InOrderTraverse_R(struct BiTNode* T, int (*visit)(char elem)) { if(T) { if(T->lchild) { if(0 != InOrderTraverse_R(T->lchild,visit)) //递归遍历左子树 return 1; } if(0 != visit(T->data)) //访问根节点 return 1; if(T->rchild) { if(0 != InOrderTraverse_R(T->rchild,visit)) //递归遍历右子树 return 1; } } return 0; } //后序遍历递归算法,返回0表示遍历成功,1为失败 int PostOrderTraverse_R(struct BiTNode* T, int (*visit)(char elem)) { if(T) { if(T->lchild) { if(0 != PostOrderTraverse_R(T->lchild,visit)) //递归遍历左子树 return 1; } if(T->rchild) { if(0 != PostOrderTraverse_R(T->rchild,visit)) //递归遍历右子树 return 1; } if(0 != visit(T->data)) //访问根节点 return 1; } return 0; } //先序遍历非递归算法 void PreOrderTraverse(struct BiTNode* T, int (*visit)(char elem)) { struct stack ss; struct BiTNode* p = T; initStack(&ss); while(p||!isEmpty(&ss)) { if(p) { visit(p->data); push(&ss,p); p=p->lchild; } else { p = getTop(&ss); pop(&ss); p = p->rchild; } } } //中序遍历非递归算法 void InOrderTraverse(struct BiTNode* T, int (*visit)(char elem)) { struct stack ss; struct BiTNode* p; initStack(&ss); push(&ss,T); while(!isEmpty(&ss)) { while(p = getTop(&ss)) push(&ss,p->lchild); //向左走到尽头 p = pop(&ss); //空指针退栈 if(!isEmpty(&ss)) { p = pop(&ss); visit(p->data); //访问节点 push(&ss,p->rchild); //向右一步 } } } //后序遍历非递归算法 void PostOrderTraverse(struct BiTNode* T, int (*visit)(char elem)) { struct stack ss; struct BiTNode* p = T; struct BiTNode* q; initStack(&ss); //初始化空栈 while(p || !isEmpty(&ss)) { if(p) { push(&ss,p); p = p->lchild; } else { p =getTop(&ss); if(p) { push(&ss,NULL); p = p->rchild; } else { pop(&ss); q = pop(&ss); visit(q->data); } } } } //main.c 测试主程序 #include<stdio.h> #include "BiTree.h" int main() { struct BiTNode* bt = 0; bt = CreateBiTree(bt); printf("先序遍历序列:\n"); PreOrderTraverse_R(bt,visit); printf("\n中序遍历序列:\n"); InOrderTraverse_R(bt,visit); printf("\n后序遍历序列:\n"); PostOrderTraverse_R(bt,visit); printf("\n非递归先序遍历序列:\n"); PreOrderTraverse(bt,visit); printf("\n非递归中序遍历序列:\n"); InOrderTraverse(bt,visit); printf("\n非递归后序遍历序列:\n"); PostOrderTraverse(bt,visit); DestroyBiTree(bt); return 0; }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-13 23:46:125楼 得分:0
    >堆栈?到底是堆还是栈。
    >堆本身就是一个完全二叉树。
    一、第一行中的堆和第二行中的堆不是一个概念。
    二、堆未必就是完全二叉树。完全二叉树只是一种比较经济的实现而已。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • MagiSu
    • 等级:
    发表于:2008-06-14 05:38:126楼 得分:5
    理论上可以使用堆栈完成任何递归,但是为了节省时间,没有必要这样做。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-14 08:27:387楼 得分:5
    一般说堆栈就是栈


    二、堆未必就是完全二叉树。完全二叉树只是一种比较经济的实现而已
    你举个不是完全二叉树的例子先
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-14 11:26:258楼 得分:7
    >二、堆未必就是完全二叉树。完全二叉树只是一种比较经济的实现而已
    >你举个不是完全二叉树的例子先
    你们是对的,我记错了。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Cyrosly
    • 等级:
    发表于:2008-06-14 13:19:519楼 得分:0
    谢谢4L,下面是我用递归写的简单的二叉树代码,编译连接都没有问题,可就是没有输出,如果换成前序遍历就会输出一堆相同的莫名其妙的值.如果用非递归重写我的CreateBintree该如何实现.谢谢
    C/C++ code
    [size=12px] #include<assert.h> #include<iostream> using namespace std; #define linkL 0 #define linkR 1 typedef struct BinNodeShape{ int data; struct BinNodeShape* node[2]; }* Bintree; static void CreateBintree(BinNodeShape*& srcNode,int depth) { if(srcNode==0){ return; } if((srcNode->node[linkL]=new BinNodeShape)==0){ cout<<"[BINTREE].OP[create].err( childL node create failed at level "<<depth<<" )"<<endl; return; } if((srcNode->node[linkR]=new BinNodeShape)==0){ cout<<"[BINTREE].OP[create].err( childR node create failed at level "<<depth<<" )"<<endl; return; } srcNode->data=0; CreateBintree(srcNode->node[linkL],--depth); CreateBintree(srcNode->node[linkR],--depth); } static void DestroyBintree(Bintree& tree) { if(tree!=0){ BinNodeShape* childL=tree->node[linkL]; BinNodeShape* childR=tree->node[linkR]; delete tree; DestroyBintree(childL); DestroyBintree(childR); } } static void BintreeIterator(Bintree tree,void (*visit)(BinNodeShape*)) { if(tree!=0){ BintreeIterator(tree->node[linkL],visit); (visit)(tree); BintreeIterator(tree->node[linkR],visit); } } static int shared=0; static void setData(BinNodeShape* node) { node->data=shared++; } static void output(BinNodeShape* node) { cout<<node->data<<endl; } int main(int argc,char** argv) { BinNodeShape* root; assert(root=new BinNodeShape); CreateBintree(root,10); BintreeIterator(root,setData); BintreeIterator(root,output); DestroyBintree(root); } [/size]
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-14 13:48:5510楼 得分:30
    C/C++ code
    #include<assert.h> #include<iostream> using namespace std; #define linkL 0 #define linkR 1 typedef struct BinNodeShape{ int data; struct BinNodeShape* node[2]; }* Bintree; static void CreateBintree(BinNodeShape*& srcNode,int depth) { if(srcNode==0){ return; } if (depth == 0){ srcNode = 0; return; } if((srcNode->node[linkL]=new BinNodeShape)==0){ cout<<"[BINTREE].OP[create].err( childL node create failed at level "<<depth<<" )"<<endl; return; } if((srcNode->node[linkR]=new BinNodeShape)==0){ cout<<"[BINTREE].OP[create].err( childR node create failed at level "<<depth<<" )"<<endl; return; } srcNode->data=0; CreateBintree(srcNode->node[linkL],depth-1); CreateBintree(srcNode->node[linkR],depth-1); } static void DestroyBintree(Bintree& tree) { if(tree!=0){ BinNodeShape* childL=tree->node[linkL]; BinNodeShape* childR=tree->node[linkR]; delete tree; DestroyBintree(childL); DestroyBintree(childR); } } static void BintreeIterator(Bintree tree,void (*visit)(BinNodeShape*)) { if(tree!=0){ BintreeIterator(tree->node[linkL],visit); (visit)(tree); BintreeIterator(tree->node[linkR],visit); } } static int shared=0; static void setData(BinNodeShape* node) { node->data=shared++; } static void output(BinNodeShape* node) { cout<<node->data<<endl; } int main(int argc,char** argv) { BinNodeShape* root; assert(root=new BinNodeShape); CreateBintree(root,10); BintreeIterator(root,setData); BintreeIterator(root,output); DestroyBintree(root); }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Cyrosly
    • 等级:
    发表于:2008-06-14 14:35:0811楼 得分:0
    结果还是一样
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Cyrosly
    • 等级:
    发表于:2008-06-14 14:39:0012楼 得分:0
    说错了,可以了,谢谢了^^-^^
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved