在学习了二叉树的基本知识后,我们来练习一些题目来增强对其的理解
一、单值二叉树
如果一个二叉树每个节点都具有相同的值,说明为一个单值二叉树,否则返回空
struct TreeNode
{
int val;
struct TreeNode* left;
struct TreeNode* right;
};
//单值二叉树
bool isUnivalTree(struct TreeNode* root)
{
assert(root);
if (root == NULL)//当查找到空子树时,说明遍历完了
{
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);
}
二、二叉树查找值为x的树
struct BTNode
{
int val;
struct BTNode* left;
struct BTNode* right;
};
//二叉树查找值为x的点
BTNode* BinaryTreeFind(BTNode* root, int x)
{
if (root == NULL)//当为空时说明,没有找到
{
return NULL;
}
if (root->val == x)//找到了
{
return root;
}
BTNode* lret = BinaryTreeFind(root->left, x);
if (lret != NULL)//当函数返回的值不为空时就返回节点
{
return lret;
}
BTNode* rret = BinaryTreeFind(root->right, x);
if (rret != NULL)
{
return rret;
}
return NULL;//到这就说明递归结束,没有找到
}
三、相同的树
当两棵树根节点与根节点值相同,左节点与左节点值相同,右节点与右节点值相同
bool isSameTree(struct TreeNode* p, struct TreeNode* q)
{
if (p == NULL && q == NULL)
{
return true;//当两者同时为空时说明两棵树相同
}
//当其中一个为空时
if (p == NULL || q == NULL)//在到这一行时因为上面的判断,所以这里必然不是同时为空那么必不相同
{
return false;
}
//当两者不为空,且值不同时
if (p->val != q->val)
{
return false;
}
//p和q的值相同,分别比较左子树与右子树
return isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
}
四、另一棵树的子树
在一棵树中找另一棵树是否为其子树
bool isSameTree(struct TreeNode* p, struct TreeNode* q)
{
if (p == NULL && q == NULL)
{
return true;//当两者同时为空时说明两棵树相同
}
//当其中一个为空时
if (p == NULL || q == NULL)//在到这一行时因为上面的判断,所以这里必然不是同时为空那么必不相同
{
return false;
}
//当两者不为空,且值不同时
if (p->val != q->val)
{
return false;
}
//p和q的值相同,分别比较左子树与右子树
return isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
}
//在一棵树中找另一棵树是否为其子树
bool isSubTree(struct TreeNode* root, struct TreeNode* subroot)
{
if (root == NULL)
{
return false;
}
if (isSameTree(root, subroot))
{
return true;
}
return isSubTree(root->left, subroot->left) && isSubTree(root->right, subroot->right);
}