C++ 中的二叉樹堂兄弟節點


假設我們有一個二叉樹,根節點位於深度 0,每個深度 k 節點的子節點位於深度 k+1。

這裡,二叉樹中的兩個節點如果具有相同的深度,但具有不同的父節點,則被稱為堂兄弟節點。

樹的所有值都是唯一的,並且樹中兩個不同節點的值為 x 和 y。我們需要檢查對應於值 x 和 y 的節點是否是堂兄弟節點。

因此,如果輸入類似於

x = 5,y = 4,則輸出將為 true

為了解決這個問題,我們將遵循以下步驟:

  • 定義一個對映 um

  • 定義一個佇列 q

  • 將根節點插入到 q 中

  • um[x] := um[y] := null

  • 當 (q 不為空) 時,執行:

    • qSize := q 的大小

    • 當 qSize > 0 時(將 qSize 減 1),執行:

      • cur := q 的第一個元素

      • 從 q 中刪除元素

      • 如果 curr 的左子節點存在,則:

        • 如果 um 包含 cur 的左子節點的值,則

          • um[cur 的左子節點的值] := cur

        • 否則

          • 將 cur 的左子節點插入到 q 中

        • 如果 um 包含 cur 的右子節點的值,則

          • um[cur 的右子節點的值] := cur

        • 否則

          • 將 cur 的右子節點插入到 q 中

      • 如果 um[x] 或 um[y] 不為零,則:

        • 如果 um[x] 為 0 或 um[y] 為 0 或 um[x] 與 um[y] 相同,則:

          • 返回 false

        • 否則

          • 返回 true

  • 返回 false

示例

讓我們檢視以下實現以更好地理解:

即時演示

#include <bits/stdc++.h>
using namespace std;
class TreeNode {
public:
   int val;
   TreeNode *left, *right;
   TreeNode(int data) {
      val = data;
      left = NULL;
      right = NULL;
   }
};
class Solution {
public:
   bool isCousins(TreeNode *root, int x, int y) {
      unordered_map<int, TreeNode *> um;
      queue<TreeNode *> q;
      q.push(root);
      um[x] = um[y] = NULL;
      while (!q.empty()) {
         int qSize = q.size();
         while (qSize-- > 0) {
            auto cur = q.front();
            q.pop();
            if (cur->left && cur->left->val != 0)
               if (um.count(cur->left->val))
                  um[cur->left->val] = cur;
               else
                  q.push(cur->left);
            if (cur->right && cur->right->val != 0)
               if (um.count(cur->right->val))
                  um[cur->right->val] = cur;
               else
                  q.push(cur->right);
         }
         if (um[x] or um[y])
            if (!um[x] or !um[y] or um[x] == um[y])
               return false;
            else
               return true;
      }
      return false;
   }
};
main() {
   Solution ob;
   TreeNode *root = new TreeNode(1);
   root->left = new TreeNode(2); root->right = new TreeNode(3);
   root->left->right = new TreeNode(4); root->right->right = new TreeNode(5);
   cout << (ob.isCousins(root, 5, 4));
}

輸入

TreeNode *root = new TreeNode(1);
root->left = new TreeNode(2); root->right = new TreeNode(3);
root->left->right = new TreeNode(4); root->right->right = new
TreeNode(5);
cout << (ob.isCousins(root, 5, 4));

輸出

1

更新於: 2020-11-16

467 次檢視

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.