📜  数据结构 |树遍历 |问题 4

📅  最后修改于: 2021-09-08 15:06:36             🧑  作者: Mango

以下函数对给定的二叉树有什么作用?

int fun(struct node *root)
{
   if (root == NULL)
      return 0;
   if (root->left == NULL && root->right == NULL)
      return 0;
   return 1 + fun(root->left) + fun(root->right);
}

(A)计算叶子节点
(B)计算内部节点
(C)返回高度,其中高度定义为从根到最深节点的路径上的边数
(D)返回直径,其中直径是任意两个节点之间最长路径上的边数。答案:(乙)
说明:该函数计算内部节点数。
1) 如果 root 为 NULL 或叶节点,则返回 0。
2) 否则返回,1 加上左子树中的内部节点数,加上右子树中的内部节点数。

请参阅以下完整程序。

#include 
  
struct node
{
  int key;
  struct node *left, *right;
};
  
int fun(struct node *root)
{
   if (root == NULL)
      return 0;
   if (root->left == NULL && root->right == NULL)
      return 0;
   return 1 + fun(root->left) + fun(root->right);
}
  
/* Helper function that allocates a new node with the
   given key and NULL left and right pointers. */
struct node* newNode(int key)
{
  struct node* node = (struct node*)
                       malloc(sizeof(struct node));
  node->key = key;
  node->left = NULL;
  node->right = NULL;
  
  return(node);
}
  
/* Driver program to test above functions*/
int main()
{
  
  /* Constructed binary tree is
            1
          /   \
        2      3
      /  \    /
    4     5  8
  */
  struct node *root = newNode(1);
  root->left        = newNode(2);
  root->right       = newNode(3);
  root->left->left  = newNode(4);
  root->left->right = newNode(5);
  root->right->left = newNode(8);
  
  printf("%d", fun(root));
  
  getchar();
  return 0;
}

这个问题的测验