【Leetcode -872.叶子相似的树 -993.二叉树的堂兄弟节点】

Leetcode

  • Leetcode -872.叶子相似的树
  • Leetcode -993.二叉树的堂兄弟节点

Leetcode -872.叶子相似的树

题目:请考虑一棵二叉树上所有的叶子,这些叶子的值按从左到右的顺序排列形成一个 叶值序列 。

举个例子,如上图所示,给定一棵叶值序列为 (6, 7, 4, 9, 8) 的树。
如果有两棵二叉树的叶值序列是相同,那么我们就认为它们是 叶相似 的。
如果给定的两个根结点分别为 root1 和 root2 的树是叶相似的,则返回 true;否则返回 false 。

示例 1:
【Leetcode -872.叶子相似的树 -993.二叉树的堂兄弟节点】_第1张图片

输入: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

示例 2:
【Leetcode -872.叶子相似的树 -993.二叉树的堂兄弟节点】_第2张图片

输入: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;
		}

Leetcode -993.二叉树的堂兄弟节点

题目:在二叉树中,根节点位于深度 0 处,每个深度为 k 的节点的子节点位于深度 k + 1 处。

如果二叉树的两个节点深度相同,但 父节点不同 ,则它们是一对堂兄弟节点。
我们给出了具有唯一值的二叉树的根节点 root ,以及树中两个不同节点的值 x 和 y 。
只有与值 x 和 y 对应的节点是堂兄弟节点时,才返回 true 。否则,返回 false。

示例 1:
【Leetcode -872.叶子相似的树 -993.二叉树的堂兄弟节点】_第3张图片

输入:root = [1, 2, 3, 4], x = 4, y = 3
输出:false

示例 2:
【Leetcode -872.叶子相似的树 -993.二叉树的堂兄弟节点】_第4张图片

输入:root = [1, 2, 3, null, 4, null, 5], x = 5, y = 4
输出:true

示例 3:
【Leetcode -872.叶子相似的树 -993.二叉树的堂兄弟节点】_第5张图片

输入: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;
		}

你可能感兴趣的:(leetcode,深度优先,算法,c语言,数据结构)