跳转至

993.Cousins in Binary Tree

Tags: Easy Tree Breadth-first Search

Links: https://leetcode.com/problems/cousins-in-binary-tree/


In a binary tree, the root node is at depth 0, and children of each depth k node are at depth k+1.

Two nodes of a binary tree are cousins if they have the same depth, but have different parents.

We are given the root of a binary tree with unique values, and the values x and y of two different nodes in the tree.

Return true if and only if the nodes corresponding to the values x and y are cousins.

Example 1: img

Input: root = [1,2,3,4], x = 4, y = 3
Output: false

Example 2: img

Input: root = [1,2,3,null,4,null,5], x = 5, y = 4
Output: true

Example 3:

img

Input: root = [1,2,3,null,4], x = 2, y = 3
Output: false

Note:

  1. The number of nodes in the tree will be between 2 and 100.
  2. Each node has a unique integer value from 1 to 100.

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    bool isCousins(TreeNode* root, int x, int y) {
        std::ios_base::sync_with_stdio(false);
        cin.tie(NULL);
        cout.tie(NULL);

        if (!root || root -> val == x || root -> val == y) return false;
        queue<TreeNode *> q;
        q.push(root);
        int depth1 = 0, depth2 = 0;
        int parent1 = -1, parent2 = -1;
        int level = 0;
        while (!q.empty()) {
            ++level;
            int n = q.size();
            for (int i = 0; i < n; ++i) {
                TreeNode *tmp = q.front(); q.pop();
                if (tmp -> left) {
                    q.push(tmp -> left);
                    if (tmp -> left -> val == x) {
                        parent1 = tmp -> val; depth1 = level + 1;
                    }
                    if (tmp -> left -> val == y) {
                        parent2 = tmp -> val; depth2 = level + 1;
                    }
                }
                if (tmp -> right) {
                    q.push(tmp -> right);
                    if (tmp -> right -> val == x) {
                        parent1 = tmp -> val; depth1 = level + 1;
                    }
                    if (tmp -> right -> val == y) {
                        parent2 = tmp -> val; depth2 = level + 1;
                    }
                }

                if (depth1 && depth2) return depth1 == depth2 && parent1 != parent2;
            }
        }

        return false;
    }
};

层序遍历找出父节点和每个节点的深度,比较即可。