统计二叉树中不同结点类型的个数
前言:收到非递归打印一个树的函数的启发,我可以利用栈来实现较高效率的统计二叉树中不同结点的个数
**函数思路:**先声明一个结点指针类型的栈,进行循环,循环条件为结点指针非空或栈非空(当结点指针与栈都为空时说明已经进行到树的最右端,完成了树的遍历),每次循环时都先将结点的左边一条儿子入栈,然后若栈非空则取栈顶指针,然后出栈,若该结点有两个子结点则满结点变量加一,反之若有一个儿子则结点变量加一,否则则为树叶统计树叶的变量加一,然后移动结点到其右儿子,遍历其右子树;当循环结束时则统计完成。
结点声明:
typedef int ElementType;
typedef struct Treenode{
ElementType data=0;
struct Treenode* Left=nullptr;
struct Treenode* Right=nullptr;
}Treenode;
typedef Treenode* Bintree;
统计函数:
void Count(Bintree root){
stack<Bintree>str;
int node=0,leaves=0,fullnode=0;
while(root||!str.empty()){
for(;root;root=root->Left) str.push(root);
if(!str.empty()){
root=str.top();
str.pop();
if(root->Left&&root->Right) fullnode++;
else if(root->Left||root->Right) node++;
else leaves++;
root=root->Right;
}
}
cout<<"The fullnodes have "<<fullnode<<endl;
cout<<"Nodes with one child have "<<node<<endl;
cout<<"Leaves have "<<leaves<<endl;
}