二叉树叶子节点 深度 以及完全二叉树的判定

  • 问题:

1.求二叉树叶子节点的个数

2.求二叉树深度

3.判断二叉树是否为完全二叉树

 

  • 预备知识:

叶子:没有左右孩子的结点。

树的深度定义:树中所有节点的层次的最大值称为该树的深度,其中规定根节点的层次为0 其他节点的层次为双亲节点层次+1。

完全二叉树:对满二叉树的结点进行连续编号,约定编号从根结点起,自上而下,自左至右。深度为k的,有n个结点的二叉树,

当且仅当其每一个结点都与深度为k的满二叉树编号从1至n的结点对应时,称为完全二叉树。

满二叉树:一颗深度为k且有2^k-1个节点的二叉树称为满二叉树。

 

  • 思路:

1.选取某种遍历方式遍历二叉树 判断当前访问的结点是否均没有左右子树,若均无,则计数器加一,直至遍历结束。

2.递归方式求二叉树的深度,设置max为所求的最大深度

递归出口:是否为叶子节点,若是回溯而且比较计数器与max值

递归逻辑:每访问一个结点计数器加1

递归调用:调用该函数

3.层次遍历+队列

若针对此二叉树

下图中以#代表空

最后判断队列是否全为空即可,若不为空,说明在空节点后还存在着非空节点,则不为完全二叉树。(理解完全二叉树的定义)

 

#include<iostream>
#include<string>
#include<queue>
using namespace std;
int maxn = 0;//最大深度
int leaf = 0;//叶子结点个数
int sum = 0;//二叉树的节点个数
typedef struct TNode {
    char data;
    TNode *leftchild, *rightchild;
    //构造函数
    TNode(char d):data(d),leftchild(NULL),rightchild(NULL){}
//析构函数 };
void CreateTree(TNode **T) { char st='0'; cin >> st; if (st== '#')*T = NULL; else { *T = new TNode(st); //构造根节点 CreateTree(&(*T)->leftchild);//构造左子树 CreateTree(&(*T)->rightchild);//构造右子树 } } void Pre(TNode *t)//先序遍历顺序 先根节点 再左子树 再右子树 { TNode *T = t; if (T != NULL) { if (T->leftchild == NULL&&T->rightchild == NULL)leaf++; sum++;//根节点 Pre(T->leftchild);//左子树 Pre(T->rightchild);//右子树 } }//count声明为全局变量 出现问题 因为命名空间std有一个count函数

void Depth(TNode *t,int k) { TNode *T = t; if (T != NULL) { if (T->leftchild == NULL&&T->rightchild == NULL) { if (k > maxn)maxn = k; }//k值随着回溯会发生改变 Depth(T->leftchild,k+1); Depth(T->rightchild, k+1); } }
bool Level(TNode *t) { /*利用层次遍历该树,遇到NULL停止遍历 ,若为完全二叉树,则此时队列中全为空指针*/ bool panduan=1; TNode *T = t; TNode *tem = NULL; queue<TNode *>q; q.push(T); tem = q.front(); q.pop(); while (tem != NULL) { q.push(tem->leftchild); q.push(tem->rightchild); tem = q.front(); q.pop(); } while (!q.empty()) { TNode *te; te = q.front(); q.pop(); if (te != NULL) { panduan = 0; break; } } return panduan; }

int main()
{
  TNode *t;
  //以先序遍历方式创建二叉树
  CreateTree(&t);

  Pre(t);
  cout << "叶子节点的个数:" <<leaf << endl;
  cout << "二叉树的结点个数:" << sum << endl;
  int k= 0;
  Depth(t,k);
  cout << "树的深度:" << maxn << endl;
  if (Level(t))cout << "该树为完全二叉树\n";
  else cout << "该树不是完全二叉树\n";


}

 

 偶然间看到求二叉树深度更为简洁的递归方式

 

posted @ 2017-05-03 18:38  LarryXXXXXXXXX  阅读(5468)  评论(1编辑  收藏  举报