c语言函数参数传递问题(递归时怎样传递)

2025-02-25 13:20:34
推荐回答(3个)
回答1:

#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);    // 左右子树都满,且高度相同,则是满的 
}

回答2:

首先你应该了解单个函数调用时的情况,递归的情况只当是一般嵌套来分析!
函数定义是否对你理解这个问题产生影响?
l_level,r_level使用前需初始化:
l_level = (int *)malloc(sizeof(int)); //需包含malloc.h
...
对于初接触指针的朋友,在参数表中使用指针,理解可能较困难!

回答3:

调试你就知道了,可以看到中间的每一步运行的结果……