1. 程式人生 > >完全二叉樹的判斷與交換左右子樹

完全二叉樹的判斷與交換左右子樹

完全二叉樹判斷

根據二叉樹的定義,具有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; 
	}
}