C语言 百分网手机站

C++如何实现二叉树叶子节点个数计算

时间:2020-10-04 16:39:15 C语言 我要投稿

C++如何实现二叉树叶子节点个数计算

  很多人都不知道C++如何实现二叉树叶子节点个数计算,下面小编为大家解答一下,希望能帮到大家!

  /*求二叉树叶子节点个数 -- 采用递归和非递归方法

  经调试可运行源码及分析如下:

  ***/

  #include

  #include

  #include

  using std::cout;

  using std::cin;

  using std::endl;

  using std::stack;

  /*二叉树结点定义*/

  typedef struct BTreeNode

  {

  char elem;

  struct BTreeNode *pleft;

  struct BTreeNode *pright;

  }BTreeNode;

  /*

  求二叉树叶子节点数

  叶子节点:即没有左右子树的结点

  递归方式步骤:

  如果给定节点proot为NULL,则是空树,叶子节点为0,返回0;

  如果给定节点proot左右子树均为NULL,则是叶子节点,且叶子节点数为1,返回1;

  如果给定节点proot左右子树不都为NULL,则不是叶子节点,以proot为根节点的'子树叶子节点数=proot左子树叶子节点数+proot右子树叶子节点数。

  /*递归实现求叶子节点个数*/

  int get_leaf_number(BTreeNode *proot)

  {

  if(proot == NULL)

  return 0;

  if(proot->pleft == NULL && proot->pright == NULL)

  return 1;

  return (get_leaf_number(proot->pleft) + get_leaf_number(proot->pright));

  }

  /*非递归:本例采用先序遍历计算

  判断当前访问的节点是不是叶子节点,然后对叶子节点求和即可。

  **/

  int preorder_get_leaf_number(BTreeNode* proot)

  {

  if(proot == NULL)

  return 0;

  int num = 0;

  stackst;

  while (proot != NULL || !st.empty())

  {

  while (proot != NULL)

  {

   cout << "节点:" << proot->elem << endl;

   st.push(proot);

   proot = proot->pleft;

  }

  if (!st.empty())

  {

   proot = st.top();

   st.pop();

   if(proot->pleft == NULL && proot->pright == NULL)

   num++;

   proot = proot -> pright;

  }

  }

  return num;

  }

  /*初始化二叉树根节点*/

  BTreeNode* btree_init(BTreeNode* &bt)

  {

  bt = NULL;

  return bt;

  }

  /*先序创建二叉树*/

  void pre_crt_tree(BTreeNode* &bt)

  {

  char ch;

  cin >> ch;

  if (ch == '#')

  {

  bt = NULL;

  }

  else

  {

  bt = new BTreeNode;

  bt->elem = ch;

  pre_crt_tree(bt->pleft);

  pre_crt_tree(bt->pright);

  }

  }

  int main()

  {

  int tree_leaf_number = 0;

  BTreeNode *bt;

  btree_init(bt);//初始化根节点

  pre_crt_tree(bt);//创建二叉树

  tree_leaf_number = get_leaf_number(bt);//递归

  cout << "二叉树叶子节点个数为:" << tree_leaf_number << endl;

  cout << "非递归先序遍历过程如下:" << endl;

  tree_leaf_number = preorder_get_leaf_number(bt);//非递归

  cout << "二叉树叶子节点个数为:" << tree_leaf_number << endl;

  system("pause");

  return 0;

  }

  /*

  运行结果:

  a b c # # # d e # # f # #

  ---以上为输入---

  ---以下为输出---

  二叉树叶子节点个数为:3

  非递归遍历过程如下:

  节点:a

  节点:b

  节点:c

  节点:d

  节点:e

  节点:f

  二叉树叶子节点个数为:3

  请按任意键继续. . .

  本例创建的二叉树形状:

  a

  b d

  c  e f

  */

【C++如何实现二叉树叶子节点个数计算】相关文章:

php如何实现的二叉树遍历(示例)07-15

C++二叉树的镜像实例12-10

C++实现一维向量旋转算法12-18

C++如何调用matlab函数11-21

计算机二级C++考点:C++语言概述12-15

C++实现自顶向下的归并排序算法11-27

C++实现自底向上的归并排序算法11-26

php如何实现快速排序09-02

计算机二级C++函数考点12-15