原题
题目大意及思路
计算出二叉查找树的最底下两层的节点数目;
在构造时就记录每个node的深度(距离根结点的距离)并记下最深深度,将它们的信息同时存入一个vector中,之后遍历得到最底层及倒数第二层的节点个数;
- 通过给出的序列构造出二叉查找树结构,DFS实现。
代码
#include<iostream>
#include<vector>
struct node{
int value,depth;
node *left,*right;
};
using namespace std;
vector<node> BST;
int maxd=0;
node * newNode(int value,int d){
node* Node=new node;
Node->value=value;
Node->depth=d;
Node->left=Node->right=NULL;
BST.push_back(*Node);
return Node;
}
void insertnode(node* &root,int value,int d){
if(root==NULL){
if(d>maxd) maxd=d;
root=newNode(value,d);
return;
}
else{
if(root->value>=value) insertnode(root->left,value,d+1);
else insertnode(root->right,value,d+1);
}
}
int main(){
int n;
cin>>n;
node *root=NULL;
for(int i=0;i<n;i++){
int value;
cin>>value;
insertnode(root,value,0);
}
int n1=0,n2=0;
for(int i=0;i<BST.size();i++){
if(BST[i].depth==maxd) n1++;
else if(BST[i].depth==maxd-1) n2++;
}
printf("%d + %d = %d",n1,n2,n1+n2);
return 0;
}
运行截图
收获
在让root指向一个结点时,刚开始我尝试了root=&node
以及*root=node
,但似乎都是错误的语句,之后便参考了书上的做法,将一个node* 的变量赋值给了root,这种办法是可以的。(但具体原因暂时还不太理解,正在寻找中,也期待各位帮忙答疑解惑)
更新:root=&node;
该语句不可行的原因:在任何时候,都不能使指针指向的地址直接改成一个常数;
第二个语句*root=node;
不可行的原因:是因为我之前编写程序的时候位申请一块内存空间,直接赋值是没有用的。
node * newNode(int value,int d){
node* Node=new node;
Node->value=value;
Node->depth=d;
Node->left=Node->right=NULL;
BST.push_back(*Node);
return Node;
}
void insertnode(node* &root,int value,int d){
if(root==NULL){
if(d>maxd) maxd=d;
root=newNode(value,d);
return;
}
else{
if(root->value>=value) insertnode(root->left,value,d+1);
else insertnode(root->right,value,d+1);
}
}