题目
给定一棵二叉链表表示的二叉树,其根结点指针为 t,试写出求二叉树的叶子结点数目的算法。
广告
若有同学需要桂林电子科技大学数据结构考研真题和答案解析(个人制作)或指定参考书《算法与数据结构》第三版张乃孝PDF等资料的欢迎交流(QQ((肆+壹)幺幺)&微信(月球不太圆)15577498906)
算法思路
1.通过中序遍历 遍历整颗二叉树。
2.判断该结点是否为叶子结点,并记录(运用指针)。
3.返回叶子结点数
代码
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
/* 计算二叉树中叶子节点个数 */
typedef struct TreeNode TreeNode;
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
TreeNode* CreateBTree();
TreeNode* CreateBTree()
{
TreeNode *bt = NULL;
int ch;
scanf("%d", &ch);
if (ch != -1)
{
bt = new TreeNode(ch);
bt->val = ch;
bt->left = CreateBTree();
bt->right = CreateBTree();
}
return bt;
}
void PutTree(TreeNode* bt)
{
if(bt==NULL)
return;
else
{
printf("%d ",bt->val);
PutTree(bt->left);
PutTree(bt->right);
}
}
void PutTreeo(TreeNode* bt)
{
if(bt==NULL)
return;
else
{
PutTree(bt->left);
printf("%d ",bt->val);
PutTree(bt->right);
}
}
void visit(TreeNode* bt,int *z,int *y)
{
if(bt->left==NULL&&bt->right==NULL)
{
*z=*z+1;
*y=*y+1;
}
else
*z=*z+1;
}
void order(TreeNode* bt,int *z,int *y)
{
if(bt!=NULL)
{
order(bt->left,z,y);
visit(bt,z,y);
order(bt->right,z,y);
}
}
int find_node(TreeNode* bt)
{
int nz=0,ny=0;//nz记录二叉树总结点数,ny记录二叉树叶子结点数
int *z,*y;
z=&nz;
y=&ny;
order(bt,z,y);
return ny;
}
int main(int argc, char** argv) {
cout<<"输入二叉树的先序遍历结果,若无子节点输入-1"<<endl;
TreeNode *bt=CreateBTree();
cout<<"success"<<endl;
cout<<"二叉树的先序遍历结果"<<endl;
PutTree(bt);
cout<<endl;
cout<<"二叉树的中序遍历结果"<<endl;
PutTreeo(bt);
cout<<endl;
cout<<"叶子结点的总数:"<<find_node(bt)<<endl;
return 0;
}
运行结果
输入1 2 3 -1 4 -1 -1 -1 5 6 7 -1 -1 -1 8 -1 9 -1 -1
按照先序遍历的顺序建立二叉树(其中字符’-1’代表空节点)