#include<bits/stdc++.h> using namespace std; typedef class bt{ public: char data; struct bt *l,*r; }node,*tree; queue<tree> q; void create(tree &t){ char ch; scanf("%c",&ch); if(ch=='#')t=NULL; else{ t=new node; t->data=ch; q.push(t->l); q.push(t->r); } q.pop(); } void pre(tree t){ if(t){ cout << t->data; pre(t->l); pre(t->r); } } void in(tree t){ if(t){ in(t->l); cout << t->data; in(t->r); } } void post(tree t){ if(t){ post(t->l); post(t->r); cout << t->data; } } int leaf_sum(tree t){ if(!t)return 0; if(!t->l&&!t->r)return 1; return leaf_sum(t->l)+leaf_sum(t->r); } int main(){ tree t; q.push(t); while(q.size()!=0){ create(q.front()); } if(t){ pre(t); cout << endl; in(t); cout << endl; post(t); cout << endl; } cout << leaf_sum(t); return 0; }
时间: 2024-03-29 15:36:39 浏览: 76
万能头文件#include&amp;lt;bits/stdc++.h&amp;gt; using namespace std;
这是一段 C++ 代码,实现了二叉树的创建、遍历以及统计叶子节点个数的功能。代码中定义了一个二叉树的节点结构体,包括节点的数据、左右子树指针。另外,定义了一个队列 `queue<tree> q`,用于存储待创建节点的左右子树指针。
函数 `create` 用于创建二叉树,其中使用了队列 `q` 来保存左右子树指针。当输入的字符为 '#' 时,说明该节点不存在,将其指针设置为 NULL;否则,创建一个新节点,并将其左右子树指针入队。
函数 `pre`、`in` 和 `post` 分别实现二叉树的前序、中序和后序遍历。这里采用了递归的方式,先遍历左子树,再遍历右子树,最后输出节点数据。
函数 `leaf_sum` 用于统计二叉树的叶子节点个数。当节点为空时,返回 0;当节点的左右子树均为空时,返回 1;否则,递归计算左子树和右子树的叶子节点个数之和。
主函数中,先将根节点的指针入队,然后通过 `create` 函数创建二叉树。如果根节点存在,输出二叉树的前序、中序和后序遍历结果,并输出叶子节点个数。
需要注意的是,代码中没有对输入字符进行判断,当输入非法字符时可能会导致程序崩溃。此外,代码中没有释放动态分配的内存,可能会造成内存泄漏。为了避免这些问题,可以在代码中添加必要的判断和释放内存的操作。
阅读全文