- 问题:
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”;
}
偶然间看到求二叉树深度更为简洁的递归方式