判断正则二叉树方法(基于c语言)

博主最近做了一个题目,关于正则二叉树的判断,题目并不难,但是很有趣,这里博主描述一下算法思想,并附上代码
网上也有其他教程,但是不同的教程,不同的思路,我们一起进步
思路:
首先,对于二叉树,我们可以采用递归的方法判断,也可以非递归,如果你不想使用递归的方法,博主这里有个思路,我们知道
非递归思路:基于队列,我们可以对二叉树进行层次遍历,对于正则二叉树,我们知道,除了第一层,每一层节点数为偶数个
所以,我么可以基于队列进行层次遍历
1.根节点入队
2.队列中的所有元素出队,如果其所有元素的孩子数为偶数,则将所有孩子入队,若为奇数,则停止判断,退出
3.反复进行2,若最后完成遍历,且队列中最后一层孩子数为偶数,则,说明是正则二叉树

递归思路,递归思路很简单
1.从树的根节点开始
2.若此树是空树,则是正则二叉树
3.若此树非空且左右子树都有,则对其左右子树进行判断,跳到1
4.若只有一个孩子,则不是正则二叉树
下面给出递归的算法代码。非递归的,博主后续可能会出

#include
#include
typedef struct Bitree{
	int data;
	struct Bitree * lchild;
	struct Bitree * rchild;
}Bitree,*Ptree;


Ptree Bitreeinit(Ptree T){
	
	T = (Ptree)malloc(sizeof(Bitree));
	T->lchild = NULL;
	T->rchild = NULL;
	return T;

}

Ptree createBitree(Ptree T) {
	int s; 
	scanf_s("%d", &s);
	if (s != -999)
	{
		T = (Ptree)malloc(sizeof(Bitree));
		T->data = s;
		T->lchild = createBitree(T->lchild);
		T->rchild = createBitree(T->rchild);
	}
	else T = NULL;
	
	return T;

}

void inorder(Ptree T) {
	if(T){
		inorder(T->lchild);
		printf("%d ", T->data);
		inorder(T->rchild);
	}
}

void zzBitree(Ptree T, int *a) {
	if (T) {
		if (*a == 1) {
			return;
		}
		else if (T->lchild != NULL && T->rchild == NULL) *a = 1;
		else if (T->lchild == NULL && T->rchild != NULL) *a = 1;
		else { 
			zzBitree(T->lchild,&(*a)); 
		     zzBitree(T->rchild,&(*a));
		}
	}
}

void main() {
	Ptree T = NULL;
	int a;
	a = 0;
	T = createBitree(T);
	inorder(T);
	zzBitree(T, &a);
	printf("%d", a);
}







你可能感兴趣的:(c++与c语言,二叉树,队列,数据结构)