1. 程式人生 > >利用二叉鏈表遞歸和非遞歸算法求葉子結點的數量

利用二叉鏈表遞歸和非遞歸算法求葉子結點的數量

pop 有時 非遞歸算法 https 我的博客 tno 測試用例 節點 ==

這是我的博客的第一篇文章,是學校裏布置的一道作業題。 之後有時間的話我會發布更多有意思的博客 #include<iostream>
#include<stack>
using namespace std;
int cnt1=0,cnt2=0;
struct BTNode
{
int data;
BTNode *l,*r;
BTNode(const int item=0,BTNode* lptr=NULL,BTNode* rptr=NULL):data(item),l(lptr),r(rptr){}
};
BTNode bt[10000]; inline void add(int a,int b,int c)
{
bt[a].data=a;
bt[b].data=b;
bt[c].data=c;
bt[a].l=&bt[b];
bt[a].r=&bt[c];
} void solve1(int root) //遞歸dfs
{
if((!bt[root].l||bt[root].l->data==0)&&(!bt[root].r||bt[root].r->data==0))
{
cnt1++;
//cout<<root<<endl;
return;
}
if(bt[root].l&&bt[root].l->data!=0)
{
solve1(bt[root].l->data);
}
if(bt[root].r&&bt[root].r->data!=0)
{
solve1(bt[root].r->data);
}
} void solve2(int root) //非遞歸dfs
{
stack<BTNode> bs;
bs.push(bt[root]);
while(!bs.empty())
{
BTNode temp=bs.top();
bs.pop();
if(temp.l!=NULL&&temp.l->data!=0)
{
bs.push(*temp.l);
}
if(temp.r!=NULL&&temp.r->data!=0)
{
bs.push(*temp.r);
}
if((temp.l==NULL||temp.l->data==0)&&(temp.r==NULL||temp.r->data==0))
{
cnt2++;
}
}
} int main()
{
ios::sync_with_stdio(false);
int t;
cout<<"輸入測試用例數:\n";
cin>>t;
while(t--)
{
memset(bt,0,sizeof(bt));
cnt1=0;
cnt2=0;
int n,a,b,c;
cout<<"輸入結點數:\n";
cin>>n;
while(1)
{
cout<<"輸入父節點和其所有子節點:\n"; //分別輸入父結點,左子結點,右子結點
cin>>a>>b>>c;
if(!a&&!b&&!c) //輸入 0 0 0 結束輸入
break;
add(a,b,c);
}
solve1(1);
solve2(1);
cout<<"葉子結點(遞歸)="<<cnt1<<endl;
cout<<"葉子結點(非遞歸)="<<cnt2<<endl;
}
return 0;
} //https://paste.ubuntu.com/p/yZsj5s5f4c/

利用二叉鏈表遞歸和非遞歸算法求葉子結點的數量