思路:
1.非遞歸算法:隨便搞個遍歷算法,分別判斷每個節點的左右孩子是否不爲空,設置一個計數器來記錄數據
2.遞歸算法:
如果p節點的左右孩子都沒有:以p爲根的樹的雙分支節點個數爲0
如果 p節點的左右孩子都有:以p爲根的樹的雙分支節點個數=p節點左子樹的雙分支結點個數+p節點右子樹的雙分支結點個數+1(p節點自己)
如果p節點只有一個孩子:以p爲根的樹的雙分支節點個數=p節點左子樹的雙分支結點個數+p節點右子樹的雙分支結點個數
int Count_lr_Child(BiTree T) {
if (T == NULL)return 0;
int res = 0;
stack<BiTNode*> S;
BiTNode* p = T;
while (p||!S.empty())
{
if(p)
{
S.push(p);
p = p->lchild;
}
else{
p = S.top();
S.pop();
if (p->rchild&&p->lchild)res++;
p = p->rchild;
}
}
return res;
}
int Count_lr_Child_DG(BiTree T) {
if (T == NULL)return 0;
else if (T->lchild&&T->rchild)return Count_lr_Child_DG(T->lchild) + Count_lr_Child_DG(T->rchild)+1;
else return Count_lr_Child_DG(T->lchild) + Count_lr_Child_DG(T->rchild);
}
void eight_4_3(BiTree T) {
//查找雙分支節點的個數
cout << "(非遞歸)雙分支節點的個數:"<< Count_lr_Child(T)<<endl;
cout << "(遞歸)雙分支節點的個數:" << Count_lr_Child_DG(T)<<endl;
}