二叉树的基础OJ习题(一)

本文介绍了三种二叉树的判断问题:1)单值二叉树,通过前序遍历或逐层比较节点值来判断;2)相同二叉树,比较两棵树的结构和节点值;3)对称二叉树,通过递归比较左右子树的对称性来确定。

T1 单值二叉树判断

//T1 单值二叉树判断
//如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。
//只有给定的树是单值二叉树时,才返回true; 否则就返回false.

//方法一:前序遍历比较
bool flag = true;
void PreOrderCompare(struct TreeNode* root, int val)
{
	if (NULL == root || false == flag) //递归里面的所有flag均为一个变量,全局变量。一旦一个flag发生改变,所有flag均发生变化
		return;

	if (root->val != val)
	{
		flag = false;
		return;//这个return可有可无
	}
	PreOrderCompare(root->left, val);
	PreOrderCompare(root->right, val);
}

bool isUnivalTree(struct TreeNode* root)
{
	if (NULL == root)
		return true;

	flag = true; //每次调用 PreOrderCompare 时将flag置为true;
	PreOrderCompare(root, root->val);
	return flag;
}
//方法二
bool isUnivalTree(struct TreeNode* root)
{
	if (NULL == root)
		return true;

	if (root->left && root->left->val != root->val)
		return false;
	if (root->right && root->right->val != root->val)
		return false;
	return isUnivalTree(root->left)
		&& isUnivalTree(root->right);
}

T2 相同二叉树判断

//T2 相同的树判断
//给你两颗二叉树的根节点p和q,编写一个函数来检验这两棵树是否相同。
//如果两颗树在结构上相同,并且结点具有相同的值,则认为它们是相同的。

bool isSameTree(struct TreeNode* p, struct TreeNode* q)
{
	if (NULL == p && NULL == q) //p、q均为空时
		return true;
	if (NULL == p || NULL == q)//p、q有一个为空时
		return false;

	if (p->val != q->val)  //p、q均不为空时
		return false;
	return isSameTree(p->left, q->left)
		&& isSameTree(p->right, q->right);
}

T3 对称二叉树判断

//T3 对称二叉树判断
//给你一个二叉树的根节点root,检查它是否轴对称。

bool isSymmetricSubTree(struct TreeNode* root1, struct TreeNode* root2)
{
	if (NULL == root1 && NULL == root2)
		return true;
	if (NULL == root1 || NULL == root2)
		return false;

	if (root1->val != root2->val)
		return false;
	return isSymmetricSubTree(root1->left, root2->right)
		&& isSymmetricSubTree(root1->right, root2->left);
}

bool isSymmetric(struct TreeNode* root)
{
	if (NULL == root)
		return true;

	return isSymmetricSubTree(root->left, root->right);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值