完全二叉樹的判斷與交換左右子樹
阿新 • • 發佈:2019-01-04
完全二叉樹判斷
根據二叉樹的定義,具有n個結點的完全二叉樹與滿二叉樹中編號為1~n的結點一一對應。
演算法思想:
採用層次遍歷的演算法,將所有結點加入佇列,(包括空結點)
當遇到空結點時,檢查後面是否有非空結點。若有,則不是完全二叉樹.
bool IsComplete(node *root){ if(!root) return true; queue<node *> q; node *now; q.push(root); while(!q.empty()){ now =q.front(); q.pop(); if(now){ q.push(now->lchild); q.push(now->rchild); } else{ while(!q.empty()){ now=q.front(); q.pop(); if(now) return false; } } } return true; }
交換左右子樹:
採用遞迴演算法實現交換左、右子樹,
1)首先交換b結點左孩子的左、右子樹,
2)然後交換b結點右孩子的左、右子樹,
3)最後交換b結點的左右子樹,當節點為空時遞迴結束(後序遍歷思想)。
演算法實現如下:
void swap(BiTree b){
if(b){
swap(b->lchild);
swap(b->rchild);
temp=b->lchild;
b->lchild=b->rchild;
b->rchild=temp;
}
}