[关于树的对联]明月秋风无尽藏 长楸古柏是佳朋 成阴乔木天然爽 过雨闲花自在香 绿树岩前疏复密 白云窗外卷还舒 柳絮一天晴如雪 松亭十里夜闻朝 千条嫩柳垂青琐 百啭流莺入建章 名园另有天...+阅读
二叉树的后序遍历非递归算法
typedef struct node { //定义树的结点
int data;
struct node *left;
struct node *right;
} *btree;
void AfterTraverseNotRecursive(node *root) //非递归后序遍历
{
btree p;
btree stack[5];
int tag[5];
int top = 0;
if (root != NULL)
{
p = root;
while (p != NULL || top != 0) {
while (p != NULL)
{
stack[++top] = p;
tag[top] = 0;
if (p != NULL)
p = p->left;
}
if (top > 0)
{
p = stack[top];
while(tag[top] == 1)
{
printf("%d", p->data);
p = stack[--top];
}
if (top > 0)
{
p = p->right;
tag[top] = 1;
}
}
};
free(stack);
free(tag);
free(p);
}
}
二叉树非递归后序遍历的思路是什么
前序:根-左-右;
中序:左-根-右;
后序:左-右-根。
遍历的思路有3个重点:
1)利用堆栈实现递归
2)树中结点要有指向父结点的指针 //后序遍历用不上这一条
3)树中结点要有标志记录是否已被访问过
上述3点其实就是自己来完成原来递归实现中系统帮你做的事
还有一点要注意,是“左-右-根”, 压栈就要先右后左
Class B-Tree{
B-Tree left;
B-Tree right;
B-Tree father;
Boolean visited = false; //初始值设为false
value; //树中存的值,可以是任何类型
}
Stack s;
B-Tree t; //要遍历的树
s.push(t)
while (!s.empty()){
Boolean hasChildren = false; //hasChildren是有子结点需要处理的意思
t = s.top();
if(t.right null & ! t.right.visited) {
s.push(t.right);
hasChildren = true;
}
if (t.left null ! t.left.visited){
s.push(t.left);
hasChildren = true;
}
if (! hasChildren) {
out.print(t.value); // 输出结点
t.visited = true;
s.pop();
}
}
下面是后序遍历二叉树的非递归算法的实现别人写的但看不太明
#includeusing namespace std;#include#include#include#define maxsize 20 //最大结点个数//#define N 14 //必须输入结点个数(包含虚结点)#define M 10 //最大深度 typedef struct node{ char data; int m; //结点的深度 struct node*lchild,*rchild; }Bitree; Bitree*Q[maxsize]; Bitree*creatree() { char ch; int front,rear; // int i=1; Bitree *T,*s; T=NULL; front=1; rear=0; coutch; s=NULL; if(ch!='') { s=(Bitree*)malloc(sizeof(Bitree)); s->data =ch; s->lchild =s->rchild =NULL; } rear++; Q[rear]=s; if(rear==1) { T=s; T->m=1; //父结点深度为一 } else{ if(s!=NULL&Q[front]!=NULL) if(rear%2==0) { Q[front]->lchild =s; Q[front]->lchild ->m =Q[front]->m+1; } else { Q[front]->rchild =s; Q[front]->rchild ->m =Q[front]->m+1; } if(rear%2==1) front++; } //i++; cin>>ch; } return T; } int countleaf(Bitree* T) { if(T==NULL) return (0); else if((T->lchild==NULL)&(T->rchild==NULL)) return(1); else return (countleaf(T->lchild)+countleaf(T->rchild)); } int treedepth(Bitree *T) { if(T==NULL) return (0); else { if(treedepth(T->lchild )>treedepth(T->rchild )) return(treedepth(T->lchild )+1); else return (treedepth(T->rchild )+1); } } void output(Bitree*T) //输出打印二叉数 { int i; if(T!=NULL) { output(T->rchild ); //右根左遍历二叉数,结果从上到下显示 for(i=1;im) cout
分别写出以非递归方式按前序中序和后序遍历二叉树的程序
#include #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 typedef char TElemType; typedef struct BiTNode{ TElemType data; struct BiTNode * lchild,*rchild; }BiTNode,*BiTree; typedef BiTree SElemType; typedef struct{ SElemType *base,*top; int stacksize; }SqStack; //栈的基本操作 void InitStack(SqStack &S){ S.base=(SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType)); if(!S.base) printf("OVERFLOW"); S.top=S.base; S.stacksize=STACK_INIT_SIZE; } int GetTop(SqStack S,SElemType &e){ if(S.top==S.base) return 0; e=*(S.top-1); return 1; } int StackEmpty(SqStack S){ if(S.top==S.base) return 1; else return 0; } int Push(SqStack &S,SElemType e){ if(S.top-S.base>=S.stacksize){ S.base=(SElemType *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType)); if(!S.base) printf("OVERFLOW"); S.top=S.base+S.stacksize; S.stacksize+=STACKINCREMENT; } *S.top++=e; return 1; } int Pop(SqStack &S,SElemType &e){ if(S.top==S.base) return 0; e=*--S.top; return 1; } //树的基本操作 void InitBiTree(BiTree &T){ T=(BiTNode *)malloc(sizeof(BiTNode)); if(!T) printf("OVERFLOW"); T->lchild=NULL; T->rchild=NULL; } void CreatBiTree(BiTree &T){ char ch; scanf("%c",&ch); if(ch==' ') T=NULL; else{ if(!(T=(BiTNode *)malloc(sizeof(BiTNode)))) printf("OVERFLOW"); T->data=ch; CreatBiTree(T->lchild); CreatBiTree(T->rchild); } } int Depth(BiTree T){ // 返回二叉树的深度 int depth,depthLeft,depthRight; if (!T) depth = 0; else { depthLeft=Depth( T->lchild ); depthRight=Depth( T->rchild ); depth=1+ (depthLeft>depthRight? depthLeft:depthRight); } return depth; } int Print(TElemType e){ printf("%c",e); return 1; }
延伸阅读:
数据结构课程设计二叉排序树的实现用顺序和二叉链表作存储结构/*以下是用c++ 实现的二叉排序树的源代码*/ #includetypedef struct TreeNode { int key; struct TreeNode *left; struct TreeNode *right; }treeNode; class BiSortTree {...
图的遍历的实现数据结构课程设计Queue.h-----------------------------------------#include#includeconst int maxSize=50;class Queue{ public:Queue(){}; ~Queue() {}; virtual bool EnQueue(const int&...
什么叫算法什么叫计算机算法一、算法是一系列解决问题的清晰指令,也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。算法常常含有重复的步骤和一些比较或逻辑判断。如果一个算法有缺陷,或不适...
图的矩阵深度和广度遍历算法图的遍历是指从图中任一给定顶点出发,依次访问图中的其余顶点。如果给定的图是连通图,则从图中的任意一点出发,按照一个指定的顺序就可以访问到图中的所有顶点,且每个顶点只访问...
C语言实现图的广度优先搜索遍历算法先写个大题思路,楼主先自己想想,想不出来的话,2天后给代码。 queue<node> q; q.push(start); bool canVisit[][]; node cur; while(!q.empty()){ cur = q.top(); q.pop(); fore...
图的深度广度优先遍历C语言程序这是我们老师给我们上数据结构课的课件#include "stdio.h"typedef int datatype; /*假定线性表元素的类型为整型*/#define maxsize 1024 /*假定线性表的最大长度为1024*/# defi...
C语音算法图的广度优先算法实现代码深度优先遍历算法(Depth-first-search),重点关注的是图的连通性(connectivity),即从图中给定的一点都能访问到哪些点。不仅如此,在遍历这些点的过程中,通过记录访问次序,可以实现其他...
c语言图的遍历邻接表存储深度广度优先遍历(1) 图的建立,按采用邻接表作为存储结构。(2) 从指定顶点出发进行深度优先搜索遍历。(3) 从指定顶点出发进行广度优先搜索遍历。#include"stdio.h"#include"string.h"#include"stdlib....
应该怎么面对长的后的生活有人说生活是一杯白开水,只要你用心去品始终能尝出滋味来,可是我始终没出有品出白开水的滋味来。 生活是一篇悦耳动人的乐章,可是我常常会发现生活中却有那么多的噪音与非音乐...