假设二叉树采用二叉链表存储结构存储,试设计一个算法,计算一棵给定二叉树的所有双分支结点个数。
题目描述:假设二叉树采用二叉链表存储结构存储,试设计一个算法,计算一棵给定二叉树的所有双分支结点个数。
分析: 可以考虑使用递归和非递归两种思路,非递归借用队列来实现。
<1>递归算法
int Dlink(BiTree T){if(T == NULL)return 0;if(T->lchild && T->rchild)return Dlink(T->lchild) + Dlink(T->rchild) + 1;elsereturn Dlink(T->lchild) + Dlink(T->rchild);
}
<2>非递归算法
非递归借用队列,节点入队,出队时,左右子树是否都存在?个数+1:哪个存在让哪个入队
int Dlink2(BiTree T){InitQueue(Q);BiTNode *p;int num = 0;EnQueue(Q,T);while(!IsEmpty(Q)){DeQueue(Q,p);if(p->lchild && p->rchild)num++;if(p->lchild)EnQueue(Q,p->lchild); if(p->rchild)EnQueue(Q,p->rchild);}return num;
}