求二叉树叶子结点个数
- 递归算法
void CountLeaf(BiTree T int& count) //二叉树T,count用于统计叶子结点个数,初始为0
{
if (T)
{
if ((!T->lchild)) && (!T - rchild))
count++;
CountLeaf(T->lchild,count);
CountLeaf(T->rchild,count);
}
}
- 非递归算法
void CountLeaf(BiTree T )
{
int count = 0; //记录叶结点个数
Stack S;
InitStack(S);
while (T != NULL || !StackEmpty(S)) //当二叉树非空,栈非空时
{
if(T != NULL) //二叉树不为空,沿左子树先访问进栈
{
Push(S, T);
T = T->lchild;
}
else
{
Pop(S,T) //当该结点为空时,将栈顶元素出栈,传给T指针(也就是空结点的父节点)
if(T->lchild==NULL&&T->rchild==NULL) //如果该结点的左右孩子为空,则为叶节点
count++;
T = T->rchild; //否则按照先序遍历方式继续访问
}
}
}
编写算法实现将二叉树bt中每一个结点的左右子树互换,已有ADDQ(Q,bt),DELQ(Q),EMPTY(Q)分别为进队,出队和判别队列是否为空的函数
typedef struct btnode //声明二叉树结点类型
{
int data;
struct btnode* lchild, * rchild;
};btnode
void ChangeNode(btnode* bt)
{
btnode* p, * q; //声明两个指针用于交换数据
if (bt)
{
ADDQ(Q, bt); //将根结点入队
while (!EMPTY(Q)) //若队列非空
{
p = DELQ(Q);
q = p->rchild;
p->rchild = p->lchild; //交换结点的左右子树
p->lchild = q;
if (p->lchild) //将该结点左右子树压入队列中
ADDQ(Q, p->lchild);
if (p->rchild)
ADDQ(Q, p->rchild);
}
}
}
试给出二叉树的自下而上,从左到右的层次遍历算法</