求二叉树高度非递归算法(C语言)

给出算法就好了,给出必要说明。用层次遍历怎么实现

第1个回答  2010-07-07
int BiTreeDepthHierarchy(BiThrTree T) //非递归类层次遍历求二叉树深度
{
int depth=0,hp,tp,lc; //hp为已访问的结点数,tp历史入队的结点总数,lc为每层最后一个结点标记
LinkQueue Q;
BiThrNode *p;
if(T)
{
p=T;
hp=0;tp=1;lc=1;
InitQueue(Q);
EnQueue(Q,p);
while(!QueueEmpty(Q))
{
DeQueue(Q,p);
hp++; //hp为已访问的结点数
if(p->lchild)
{
EnQueue(Q,p->lchild);
tp++; //tp记录历史入队的结点总数
}
if(p->rchild)
{
EnQueue(Q,p->rchild);
tp++;
}
if(hp==lc) //当hp=lc时,表明本层结点均已访问完
{
depth++;
lc=tp; //lc=tp,更新下层的末结点标记
}
}
}
return depth;
}本回答被提问者采纳

如何用非递归算法求二叉树的高度
if(T==null)return0;intfront=-1,rear=-1;//front出队指针 rear入队指针intlast=0,level=0;//last每一层的最右指针 (front==last时候一层遍历结束level++)BiTreeQ[Maxsize];//模拟队列Q[++rear]=T;BiTreep;while(front<rear){ p=Q[++front];//开...

二叉树先序非递归遍历C语言算法
\/*---递归---先序建立二叉树---*\/void CreateBiTree(bitree **T) { \/\/按先序次序输入二叉树中的结点的值(一个字符),空格字符表示空树, \/\/构造二叉链表表示二叉树 char ch; scanf("%c",&ch); if(ch=='#') *T=NULL; else{ *T=(bitree * )malloc(sizeof(bitree)); if(!*T) exit(1...

已知二叉树采用链表存储结构,根结点指针为T,请写出计算二叉树中度...
采用深度或者广度遍历就可以,分别采用栈或者队列结构。对于访问到的每个节点,如果度为2,就是所求的。比如用栈的话 push(ST,root)while(not empty(ST)){ node=pop(ST)if(node->left)push(ST,node->left)if(node->right)push(ST,node->right)} 上面的伪代码实际上就是图的深度遍历,二叉树...

编写非递归算法,求二叉树中叶子结点的个数
typedef struct _btree { int v;struct _btree* l;struct _btree* r;} *node;\/\/ . . . .int count_nodes(node root){ node a[100];node* p = a;node t;int n = 0;p++ = root;while(p != a) { t = *--p;++n;if(t->l) *p++ = t->l;if(t->r) *p++ = t-...

二叉树的深度算法怎么算啊
二叉树的深度算法:一、递归实现基本思想:为了求得树的深度,可以先求左右子树的深度,取二者较大者加1即是树的深度,递归返回的条件是若节点为空,返回0 算法:1 int FindTreeDeep(BinTree BT){ 2 int deep=0;3 if(BT){ 4 int lchilddeep=FindTreeDeep(BT->lchild);5 int rchilddeep=Find...

二叉树的层次遍历(非递归)可否借助栈来实现?
1.先序遍历非递归算法 define maxsize 100 typedef struct { Bitree Elem[maxsize];int top;}SqStack;void PreOrderUnrec(Bitree t){ SqStack s;StackInit(s);p=t;while (p!=null || !StackEmpty(s)){ while (p!=null) \/\/遍历左子树 { visite(p->data);push(s,p);p=p->lc...

跪求!!10分奉上!统计二叉树结点个数的算法 非递归
必须说明的是,非递归思想一般都需要额外栈或队列结构的支持。下面来看一下关于统计二叉树结点个数的非递归算法设计:1、将根结点插入队列。2、判断队列是否为空,非空执行第三步,否则执行第四步退出循环。3、从队列中取出一个结点,同时将取出结点的儿子结点插入队列。此外,将计数器加1,再转到第二...

设二叉树以二叉链表为存储结构,编写一个后续遍历二叉树的非递归算法
{ if(S.base == S.top) return ERROR;S.top--;e = *S.top;return OK;} Status StackEmpty(SqStack S){ if(S.top == S.base) return TRUE;else return FALSE;} Status PreOrderCreateBiTree(BiTree &T){ char ch;scanf("%c",&ch);if(ch == '0') T = NULL;else { ...

...0x00000000 时发生访问冲突 C语言 二叉树非递归遍历
你在主函数进行非递归调用时用到栈s,但s是一个指针,而你调用之前没有构造s,即s是一个野指针。并且栈的结构也定义错误, 正确的主函数应该如下 void main(){ BiTree T;struct su{ BiTNode *base;BiTNode *top;}*s;T = CreateBiTree();\/\/建立 s = (su*) malloc (sizeof(su)); \/\/...

二叉树的遍历非递归算法中应注意哪些问题
中序非递归算法 【思路】T是要遍历树的根指针,中序遍历要求在遍历完左子树后,访问根,再遍历右子树。问题:如何用栈来保存信息,使得在中序遍历过左子树后,能利用栈顶信息获取T指针?方法:先将T入栈,遍历左子树;遍历完左子树返回时,栈顶元素应为T,出栈,访问T->data,再中序遍历T的右...

相似回答