#include
/*比如一个判断一棵二叉树是否为满二叉树的函数*/
typedef struct btnode{
int data;
struct btnode *lchild;
struct btnode *rchild;
} BTnode;
// 返回最大值
int max(int a, int b)
{
return a > b ? a : b;
}
// 返回树的高度
int level(BTnode *bt)
{
if (NULL == bt) return 0;
return max(level(bt->lchild), level(bt->lchild)) + 1;
}
// 是满二叉树返回1,不是返回0;
int bt_juge(BTnode *bt)
{
return
NULL == bt || // 空树是满的,或
level(bt->lchild) == level(bt->rchild) && // 左右子树高度相同,且
bt_jude(bt->lchild) && bt_jude(bt->rchild); // 左右子树都是满的
}
你原来的程序相当于这样:(“只有一个根节点的二叉树是满二叉树”这个判断没有必要,可省略)
#include
/*比如一个判断一棵二叉树是否为满二叉树的函数*/
typedef struct btnode{
int data;
struct btnode *lchild;
struct btnode *rchild;
} BTnode;
// 是满二叉树返回 1,不是返回 0
int bt_juge(BTnode *bt, int *level)
{
int l, r, a, b;
if (NULL == bt)
{
*level = 0; // 空树的高度为 0
return 1; // 空树是满的
}
a = bt_jude(bt->lchild, &l); // 判断左子树是否满,并接收左子树的高度 l
b = bt_jude(bt->rchild, &r); // 判断右子树是否满,并接收右子树的高度 r
*level = (l > r ? l : r) + 1; // 这里把树本身的高度传递回调用它的程序
return a && b && (l == r); // 左右子树都满,且高度相同,则是满的
}
首先你应该了解单个函数调用时的情况,递归的情况只当是一般嵌套来分析!
函数定义是否对你理解这个问题产生影响?
l_level,r_level使用前需初始化:
l_level = (int *)malloc(sizeof(int)); //需包含malloc.h
...
对于初接触指针的朋友,在参数表中使用指针,理解可能较困难!
调试你就知道了,可以看到中间的每一步运行的结果……