[数据结构课程设计二叉排序树的实现用顺序和二叉链表作存储结构]/*以下是用c++ 实现的二叉排序树的源代码*/ #includetypedef struct TreeNode { int key; struct TreeNode *left; struct TreeNode *right; }treeNode; class BiSortTree {...+阅读
求一个二叉树的后序遍历非递归算法
// 中序遍历伪代码:非递归版本,用栈实现,版本2 void InOrder2(TNode* root) { Stack S; if( root != NULL ) { S.push(root); } while ( !S.empty() ) { TNode* node = S.pop(); if ( node->bPushed ) { // 如果标识位为true,则表示其左右子树都已经入栈,那么现在就需要访问该节点了 Visit(node); } else { // 左右子树尚未入栈,则依次将 右节点,根节点,左节点 入栈 if ( node->right != NULL ) { node->right->bPushed = false; // 左右子树均设置为false S.push(node->right); } node->bPushed = true; // 根节点标志位为true S.push(node); if ( node->left != NULL ) { node->left->bPushed = false; S.push(node->left); } } } } 对比先序遍历,这个算法需要额外的增加O(n)的标志位空间。
另外,栈空间也扩大,因为每次压栈的时候都压入根节点与左右节点,因此栈空间为O(n)。时间复杂度方面,每个节点压栈两次,作为子节点压栈一次,作为根节点压栈一次,弹栈也是两次。因此无论从哪个方面讲,这个方法效率都不及InOrder1。 后序 void postOrder(TreeNode*root) { stack*>st; TreeNode*p = root; TreeNode*pre = NULL;//pre表示最近一次访问的结点 while(p || st.size()!=0) { //沿着左孩子方向走到最左下 。
while(p) { st.push(p); p = p->left; } //get the top element of the stack p = st.top(); //如果p没有右孩子或者其右孩子刚刚被访问过 if(p->right == NULL || p->right == pre) { / isit this element and then pop it cout
后序遍历用递归和非递归的方法一起都要
我们的数据结构实验也是这题,需要我把我的实验报告给你参考下么! 我这里就只发这部分的代码。Status PreOrderTraverse(BiTree T){ //先序遍历二叉树T的递归算法 if (T) { printf("%d ",T->data); if(T->lchild) PreOrderTraverse(T->lchild); if(T->rchild) PreOrderTraverse(T->rchild); return FALSE; } else return OK;}Status PreOrder(BiTree T){ //先序遍历二叉树T的非递归算法 while(!(T==NULL&top==NULL)) { if(T) { printf("%d ",T->data); push(T); T=T->lchild; } else { T=(BiTree)pop(); T=T->rchild; } } }Status InOrderTraverse(BiTree T){ //中序遍历二叉树T的递归算法 if (T) { if (T->lchild) InOrderTraverse(T->lchild); printf("%d ",T->data); if (T->rchild) InOrderTraverse(T->rchild); return FALSE; } else return OK;}Status InOrder(BiTree T){ //中序遍历二叉树T的非递归算法 while(!(T==NULL&top==NULL)) { while(T) { push(T); T=T->lchild; } T=(BiTree)pop(); printf("%d ",T->data); T=T->rchild; }}Status PostOrderTraverse(BiTree T){ //后序遍历二叉树T的递归算法 if (T) { if (T->lchild) PostOrderTraverse(T->lchild); if (T->rchild) PostOrderTraverse(T->rchild); printf("%d ",T->data); return FALSE; } else return OK;}Status PostOrder(BiTree T){ //后序遍历二叉树T的递归算法 unsigned sign;//记录结点从栈中62616964757a686964616fe78988e69d8331333264643732弹出的次数 while(!(T==NULL&top==NULL)) { if(T) { push(T);//第一次遇到结点T时压入其指针 push
(1);//置标志为1 T=T->lchild; } else { while(top) { sign=pop(); T=(BiTree)pop(); if(1==sign)//表示走过T的左子树 { push(T); push
(2); T=T->rchild; break; } else { if(2==sign)//表示T的左右子树都已走过 { printf("%d ",T->data); T=NULL; } } } } }}另外,团IDC网上有许多产品团购,便宜有口碑
数据结构课程设计报告:后序遍历用递归和非递归的方法一起都
我们的数据结构实验也是这题,需要我把我的实验报告给你参考下么! 我这里就只发这部分的代码。Status PreOrderTraverse(BiTree T) { //先序遍历二叉树T的递归算法 if (T) { printf("%d ",T->data); if(T->lchild) PreOrderTraverse(T->lchild); if(T->rchild) PreOrderTraverse(T->rchild); return FALSE; } else return OK; } Status PreOrder(BiTree T) { //先序遍历二叉树T的非递归算法 while(!(T==NULL&top==NULL)) { if(T) { printf("%d ",T->data); push(T); T=T->lchild; } else { T=(BiTree)pop(); T=T->rchild; } } } Status InOrderTraverse(BiTree T) { //中序遍历二叉树T的递归算法 if (T) { if (T->lchild) InOrderTraverse(T->lchild); printf("%d ",T->data); if (T->rchild) InOrderTraverse(T->rchild); return FALSE; } else return OK; } Status InOrder(BiTree T) { //中序遍历二叉树T的非递归算法 while(!(T==NULL&top==NULL)) { while(T) { push(T); T=T->lchild; } T=(BiTree)pop(); printf("%d ",T->data); T=T->rchild; } } Status PostOrderTraverse(BiTree T) { //后序遍历二叉树T的递归算法 if (T) { if (T->lchild) PostOrderTraverse(T->lchild); if (T->rchild) PostOrderTraverse(T->rchild); printf("%d ",T->data); return FALSE; } else return OK; } Status PostOrder(BiTree T) { //后序遍历二叉树T的递归算法 unsigned sign;//记录结点从栈中弹出的次数 while(!(T==NULL&top==NULL)) { if(T) { push(T);//第一次遇到结点T时压入其指针 push
(1);//置标志为1 T=T->lchild; } else { while(top) { sign=pop(); T=(BiTree)pop(); if(1==sign)//表示走过T的左子树 { push(T); push
(2); T=T->rchild; break; } else { if(2==sign)//表示T的左右子树都已走过 { printf("%d ",T->data); T=NULL; } } } } } }
求二叉树后序遍历的非递归并行算法
#define maxsize 100typedef enum{L,R} tagtype;typedef struct { Bitree ptr; tagtype tag;}stacknode;typedef struct{ stacknode Elem[maxsize]; int top;}SqStack;void PostOrderUnrec(Bitree t){ SqStack s; stacknode x; StackInit(s); p=t; do { while (p!=null) //遍历左子树 { x.ptr = p; x.tag = L; //标记为左子树 push(s,x); p=p->lchild; } while (!StackEmpty(s) && s.Elem[s.top].tag==R) { x = pop(s); p = x.ptr; visite(p->data); //tag为R,表示右子树访问完毕,故访问根结点 } if (!StackEmpty(s)) { s.Elem[s.top].tag =R; //遍历右子树 p=s.Elem[s.top].ptr->rchild; } }while (!StackEmpty(s));}//PostOrderUnrec 你参考一下,这应该是标准的答案
延伸阅读:
求编程领域上一些经典算法同时也是程序员必须掌握的算法这是我在一个论坛里看到的,你也参考参考吧。C++的虚函数====================== C++使用虚函数实现了其对象的多态,C++对象的开始四个字节是指向虚函数表的指针,其初始化顺序是...
怎么样成为一个算法工程师看看招聘算法工程师的要求大概能知道一些情况: 华为:无线RTT(无线传输技术)算法工程师 主要工作职责 1.根据各无线产品(包括WCDMA(含HSPA)/CDMA2000/Wimax/GSM(EDGE)需求,分析和设计...
求关于树的诗歌写树的诗句 1.树木丛生,百草丰茂。 2.绿树村边合,青山郭外斜。 3.庭中有奇树,绿叶发华滋。 4.鸟宿池边树,僧敲月下门。 5.碧玉妆成一树高,万条垂下绿丝绦。 6.忽如一夜春风来,千树...
图的矩阵深度和广度遍历算法图的遍历是指从图中任一给定顶点出发,依次访问图中的其余顶点。如果给定的图是连通图,则从图中的任意一点出发,按照一个指定的顺序就可以访问到图中的所有顶点,且每个顶点只访问...
C语言实现图的广度优先搜索遍历算法先写个大题思路,楼主先自己想想,想不出来的话,2天后给代码。 queue<node> q; q.push(start); bool canVisit[][]; node cur; while(!q.empty()){ cur = q.top(); q.pop(); fore...
c语言图的遍历邻接表存储深度广度优先遍历(1) 图的建立,按采用邻接表作为存储结构。(2) 从指定顶点出发进行深度优先搜索遍历。(3) 从指定顶点出发进行广度优先搜索遍历。#include"stdio.h"#include"string.h"#include"stdlib....
左边一个言右边一个疑的后半面打一成语左边一个言右边一个疑的后半面打一成语,成语玩命猜:左边一个言右边一个疑的后半面打一成语——半信半疑。 半信半疑 bàn xìn bàn yí 【解释copy】有点相信,又有点怀疑。表...
广字下面一个林一个非是什么字广字下面一个林一个非是什么字,子非鱼安知鱼之乐什么意思:基本字义 ● 靡 míㄇㄧˊ ◎ 浪费,奢侈:~荡。~费。侈~。 ◎ 分散:~散(消灭)。 ◎ 古同“糜”,糜烂。详细解释 【释义】浪...
数据结构算法求高手解答数据结构算法求高手解答,数据结构题的算法:用C语言给你写了一个,其他语言的话再说,算法思想基本就是从表头开始遍历,按照fibonacci的特性进行检验 按单链表的特点,节点命名为node,...