题目
编写一个函数count(),传入参数为一棵二叉树(不是二叉搜索树BST)和一个较小的值mink和一个较大的值maxk,返回值介于mink和maxk之间的结点数目。
广告
若有同学需要桂林电子科技大学数据结构考研真题和答案解析(个人制作)或指定参考书《算法与数据结构》第三版张乃孝PDF等资料的欢迎交流(QQ((肆+壹)幺幺)&微信(月球不太圆)15577498906)
算法思路
按照后序遍历的顺序,遍历每一个结点,记录介于mink和maxk之间的结点数目。返回记录的值。
代码
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
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);
}
}
int visit(TreeNode * t,int mink,int maxk)
{
if(t->val<=maxk&&t->val>=mink)//判断结点的值是否介于mink和maxk之间
return 1;
else
return 0;
}
void func(TreeNode * t,int mink,int maxk,int &s)
{
if(t!=NULL)
{
func(t->left,mink,maxk,s);
func(t->right,mink,maxk,s);
s=s+visit(t,mink,maxk);//遍历每一个结点
}
}
int count(TreeNode * t,int mink,int maxk)
{
int s=0;//记录介于mink和maxk之间的结点数目
func(t,mink,maxk,s);
return s;
}
int main(int argc, char** argv) {
int mink=2,maxk=8;
TreeNode *bt=CreateBTree();
cout<<"介于"<<mink<<"与"<<maxk<<"之间的结点数目:"<<count(bt,mink,maxk)<<endl;
PutTree(bt);
return 0;
}
运行结果
输入3 1 4 -1 -1 5 -1 9 -1 -1 6 -1 3 20 -1 1 -1 -1 7 -1 -1