题目:请考虑一棵二叉树上所有的叶子,这些叶子的值按从左到右的顺序排列形成一个 叶值序列 。
举个例子,如上图所示,给定一棵叶值序列为 (6, 7, 4, 9, 8) 的树。
如果有两棵二叉树的叶值序列是相同,那么我们就认为它们是 叶相似 的。
如果给定的两个根结点分别为 root1 和 root2 的树是叶相似的,则返回 true;否则返回 false 。
输入:root1 = [3, 5, 1, 6, 2, 9, 8, null, null, 7, 4], root2 = [3, 5, 1, 6, 7, 4, 2, null, null, null, null, null, null, 9, 8]
输出:true
输入:root1 = [1, 2, 3], root2 = [1, 3, 2]
输出:false
提示:
给定的两棵树结点数在 [1, 200] 范围内
给定的两棵树上的值在 [0, 200] 范围内
思路:创建两个数组 a1,a2 分别存放两棵树的叶子节点,最后依次比较两个数组的值是否相等,相等返回 true,否则返回 false;
void dfs(struct TreeNode* root, int* a, int* Size)
{
if (root == NULL)
return;
//判断是否是叶子节点
if (root->left == NULL && root->right == NULL)
{
a[(*Size)++] = root->val;
return;
}
dfs(root->left, a, Size);
dfs(root->right, a, Size);
}
bool leafSimilar(struct TreeNode* root1, struct TreeNode* root2)
{
//创建两个数组,分别存放两棵树的叶子的值
int a1[200];
int a2[200];
int Size1 = 0, Size2 = 0;
dfs(root1, a1, &Size1);
dfs(root2, a2, &Size2);
//如果两棵树的叶子的长度不一样,返回false
if (Size1 != Size2)
return false;
//遍历两个数组,比较对应的叶子节点的值是否相等,不相等就返回false
for (int i = 0; i < Size1; i++)
{
if (a1[i] != a2[i])
return false;
}
//最后到这里说明相等,返回true
return true;
}
题目:在二叉树中,根节点位于深度 0 处,每个深度为 k 的节点的子节点位于深度 k + 1 处。
如果二叉树的两个节点深度相同,但 父节点不同 ,则它们是一对堂兄弟节点。
我们给出了具有唯一值的二叉树的根节点 root ,以及树中两个不同节点的值 x 和 y 。
只有与值 x 和 y 对应的节点是堂兄弟节点时,才返回 true 。否则,返回 false。
输入:root = [1, 2, 3, 4], x = 4, y = 3
输出:false
输入:root = [1, 2, 3, null, 4, null, 5], x = 5, y = 4
输出:true
输入:root = [1, 2, 3, null, 4], x = 2, y = 3
输出:false
提示:
二叉树的节点数介于 2 到 100 之间。
每个节点的值都是唯一的、范围为 1 到 100 的整数。
思路:定义 x 和 y 的 target ,depth ,parent 和 found,分别是 x 或 y 的值;x 或 y 节点所在树的深度;x 或 y 的父节点(假设根节点的父节点是NULL);x 或 y 的查找情况;然后递归树,如果找到值为 x 或 y 的节点就更新 x 或 y 的情况;
//分别定义 x 的值:x_target;x 所在节点的深度:x_depth;x 节点的父节点:x_parent;是否找到 x 节点:x_found
int x_target;
int x_depth;
struct TreeNode* x_parent;
bool x_found;
int y_target;
int y_depth;
struct TreeNode* y_parent;
bool y_found;
void dfs(struct TreeNode* root, int depth, struct TreeNode* parent)
{
if (root == NULL)
return;
//如果找到值为 x 的节点,就更新 x 的父节点、深度、查找情况
if (root->val == x_target)
{
x_parent = parent;
x_depth = depth;
x_found = true;
}
//如果找到值为 y 的节点,就更新 y 的父节点、深度、查找情况
if (root->val == y_target)
{
y_parent = parent;
y_depth = depth;
y_found = true;
}
// 如果两个的查找情况都为 true,提前返回
if (x_found && y_found)
return;
//递归其左子树,当前深度加一,下一个节点的父节点
dfs(root->left, depth + 1, root);
// 如果两个的查找情况都为 true,提前返回
if (x_found && y_found)
return;
//递归其右子树,当前深度加一,下一个节点的父节点
dfs(root->right, depth + 1, root);
}
bool isCousins(struct TreeNode* root, int x, int y)
{
//初始化
x_target = x;
y_target = y;
x_found = false;
y_found = false;
//三个参数分别为根节点,深度,当前节点的父节点(假设第一个节点的父节点为NULL)
dfs(root, 0, NULL);
//最后判断 x 和 y 节点的深度是否相等,并判断它们的父节点是否相同
return x_depth == y_depth && x_parent != y_parent;
}