搜尋
首頁後端開發C++二元樹中等腰三角形的數量
二元樹中等腰三角形的數量Sep 05, 2023 am 09:41 AM
數量二元樹等腰三角形

二元樹是一種資料結構,其中每個節點最多可以有兩個子節點。這些孩子分別稱為左孩子和右孩子。假設我們得到了一個父數組表示,您必須使用它來建立一棵二元樹。二元樹可能有幾個等腰三角形。我們必須找到該二元樹中可能的等腰三角形的總數。

在本文中,我們將探討幾種在C 中解決這個問題的技術。

理解問題

給你一個父數組。您必須以二元樹的形式表示它,以便數組索引形成樹節點的值,而數組中的值給出該特定索引的父節點。

請注意,-1 總是根父節點。下面給出的是一個數組及其二元樹表示。

Parent array = [0, -1, 3, 1, 1, 2, 2, 3, 4, 4]

二元樹 -

二元樹中等腰三角形的數量

##在任何二元樹中,我們都可以三種類型的等腰三角形 -

  • 左等腰三角形  在這個三角形中,頂點是一個左邊的父節點的子節點,而形成底邊(等腰三角形的兩邊)的頂點是頂點的左子節點。子節點可以是直接的或間接的。在上面的樹中,我們有兩個這樣的等腰三角形-(2, 6, 3),(3, 7, 1)。

  • #直角等腰三角形  在此三角形中,頂點是父級的子級,而形成基部的頂點是頂點的右子級。孩子可以是直接的或間接的。在上面的樹中,我們只有一個這樣的等腰三角形 (4, 1, 8)。

  • #平衡等腰三角形  在此三角形中,形成底邊的頂點是頂點節點的左子節點和右子節點。在上面的樹中,我們有五個這樣的等腰三角形(1, 3, 4), (3, 2, 7), (4, 8, 9), (2, 5, 6), (1, 2, 9)

#因此,對於上述二元樹,我們共有8個等腰三角形

使用深度優先搜尋遍歷

深度優先搜尋(DFS)是一種以深度方式遍歷樹的所有節點的方法。它從根節點開始,移動到每個分支,然後回溯。

  • 首先,我們使用DFS遍歷二元樹的每個節點,並將其轉換為圖,以便每個節點表示為彼此相鄰。這使得遍歷更加容易。

  • 對於每個節點,我們檢查它是否有子節點。在檢查完後,我們使用 sort(node[x].begin(), node[x].end()) 函數對它們進行排序。

  • 接下來,我們檢查目前節點是否是其對應父節點的左或右後繼節點。我們對二元樹的所有節點遞歸使用DFS函數。

  • 如果目前節點有兩個子節點(直接或間接),我們透過計算它們之間的邊來檢查存在等腰三角形的可能性。我們將透過下面程式碼中給出的 graph 函數找到它們之間的邊。

  • 最後,我們透過將不同位置的所有可能的三角形相加來計算等腰三角形的總數。

範例

#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;

#define MAX int(1e5)
vector < int > * node;
int right_down[MAX];
int right_up[MAX];
int left_down[MAX];
int left_up[MAX];

// DFS traversal over a node
void DFS(int x, int * parent) {
   // Check if adjacent nodes are present for node x
   if (node[x].size() != 0)
      sort(node[x].begin(), node[x].end());

   // Check whether the node has a parent node
   if (parent[x] != -1) {
      int indexOfParent = parent[x];
      int childrenCount = node[indexOfParent].size();

      if (childrenCount > 1) {
         int parentFirstChild = node[indexOfParent][0];

         // Check if current node is left node of the parent
         if (x == parentFirstChild) {
            right_up[x] += right_up[indexOfParent] + 1;
            // Check if current node is right node of the parent  
         } else {
            left_up[x] += left_up[indexOfParent] + 1;
         }
      } else {
         right_up[x] += right_up[indexOfParent] + 1;
      }
   }

   // Iterate over children of current node  
   for (int i = 0; i < node[x].size(); ++i) {
      int y = node[x][i];
      DFS(y, parent);

      // left child of current node
      if (i == 0) {
         left_down[x] += left_down[y] + 1;
      }
      // right child of current node
      else {
         right_down[x] += right_down[y] + 1;
      }
   }
}

int graph(int * parent, int N) {
   int rootNode;
   node = new vector < int > [N];

   for (int i = 0; i < N; ++i) {
      if (parent[i] != -1) {
         node[parent[i]].push_back(i);
      } else {
         rootNode = i;
      }

      left_up[i] = 0;
      right_up[i] = 0;
      left_down[i] = 0;
      right_down[i] = 0;
   }
   return rootNode;
}

int main() {
   int N = 10;
   int parent[] = { 0, -1, 3, 1, 1, 2, 2, 3, 4, 4 };
   int rootNode = graph(parent, N);
   DFS(rootNode, parent);
   int count = 0;
   // Counting the total isosceles triangles
   for (int i = 0; i < N; ++i) {
      count += min(right_down[i], right_up[i]);
      count += min(left_down[i], left_up[i]);
      count += min(left_down[i], right_down[i]);
   }
   cout << "Number of isosceles triangles in the binary tree are " <<
      count;
   return 0;
}

輸出

Number of isosceles triangles in the binary tree are 8

結論

我們已經討論了當給定父數組時如何找到二元樹中等腰三角形的總數。我們可以透過使用深度優先搜尋來實現這一點,它允許我們遍歷二元樹。

以上是二元樹中等腰三角形的數量的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:tutorialspoint。如有侵權,請聯絡admin@php.cn刪除
OpenOOD更新v1.5:全面、精确的分布外检测代码库及测试平台,支持在线排行榜、一键测试OpenOOD更新v1.5:全面、精确的分布外检测代码库及测试平台,支持在线排行榜、一键测试Jul 03, 2023 pm 04:41 PM

分布外(OOD)检测对于开放世界智能系统的可靠运行至关重要,但目前面向对象的检测方法存在「评估不一致」(evaluationinconsistencies)的问题。之前的工作OpenOODv1统一了OOD检测的评估,但在可扩展性和可用性方面仍然存在限制。最近开发团队再次提出OpenOODv1.5,相比上一版本,新的OOD检测方法评估在确保准确、标准化和用户友好等方面得到显著提升。图片Paper:https://arxiv.org/abs/2306.09301OpenOODCodebase:htt

涨知识!用逻辑规则进行机器学习涨知识!用逻辑规则进行机器学习Apr 01, 2023 pm 10:07 PM

在准确率-召回率曲线上,同样的点是用不同的坐标轴绘制的。警告:左边的第一个红点(0%召回率,100%精度)对应于0条规则。左边的第二个点是第一个规则,等等。 Skope-rules使用树模型生成规则候选项。首先建立一些决策树,并将从根节点到内部节点或叶子节点的路径视为规则候选项。然后通过一些预定义的标准(如精确度和召回率)对这些候选规则进行过滤。只有那些精确度和召回率高于其阈值的才会被保留。最后,应用相似性过滤来选择具有足够多样性的规则。一般情况下,应用Skope-rules来学习每个根本原因的

在C语言中打印二叉树的左视图在C语言中打印二叉树的左视图Sep 03, 2023 pm 01:25 PM

任务是打印给定二叉树的左节点。首先,用户将插入数据,从而生成二叉树,然后打印所形成的树的左视图。每个节点最多可以有2个子节点,因此这里程序必须仅遍历与节点关联的左指针如果左指针不为空,则意味着它将有一些与之关联的数据或指针,否则它将是要打印并显示为输出的左子级。示例Input:10324Output:102这里,橙色节点代表二叉树的左视图。在给定的图中,数据为1的节点是根节点,因此它将被打印,而不是转到左子节点,它将打印0,然后它将转到3并打印其左子节点,即2。我们可以使用递归方法来存储节点的级

Java中的二叉树结构详解Java中的二叉树结构详解Jun 16, 2023 am 08:58 AM

二叉树是计算机科学中常见的数据结构,也是Java编程中常用的一种数据结构。本文将详细介绍Java中的二叉树结构。一、什么是二叉树?在计算机科学中,二叉树是一种树形结构,每个节点最多有两个子节点。其中,左侧子节点比父节点小,右侧子节点则比父节点大。在Java编程中,常用二叉树表示排序,搜索以及提高对数据的查询效率。二、Java中的二叉树实现在Java中,二叉树

Linux命令:查看telnet进程数量的方法Linux命令:查看telnet进程数量的方法Mar 01, 2024 am 11:39 AM

Linux命令是系统管理员日常工作中必不可少的工具之一,它们可以帮助我们完成各种系统管理任务。在运维工作中,有时候需要查看系统中某个进程的数量以便及时发现问题和进行调优。本文将介绍如何使用Linux命令查看telnet进程的数量,让我们一起来学习吧。在Linux系统中,我们可以使用ps命令结合grep命令来查看telnet进程的数量。首先,我们需要打开终端,

如何在Java中找到运行时提供的参数数量?如何在Java中找到运行时提供的参数数量?Sep 23, 2023 pm 01:13 PM

在Java中,在运行时传递参数的一种方法是使用命令行或终端。在检索命令行参数的这些值时,我们可能需要查找用户在运行时提供的参数数量,这可以借助length属性来实现。本文旨在借助示例程序解释传递和获取用户提供的参数数量的过程。获取用户在运行时提供的参数数量在查找命令行参数的数量之前,我们的第一步是创建一个允许用户在运行时传递参数的程序。字符串[]参数在编写Java程序时,我们经常遇到main()方法。当JVM调用此方法时,Java应用程序开始执行。它与一个名为String[]args的参数一起使

在C语言中,将二叉树的右视图打印出来在C语言中,将二叉树的右视图打印出来Sep 16, 2023 pm 11:13 PM

任务是打印给定二叉树的右节点。首先用户将插入数据以创建二叉树,然后打印所形成的树的右视图。上图展示了使用节点10、42、93、14、35、96、57和88创建的二叉树,其中选择并显示在树的右侧的节点。例如,10、93、57和88是二叉树的最右节点。示例Input:1042931435965788Output:10935788每个节点都有两个指针,即左指针和右指针。根据这个问题,程序只需遍历右节点。因此,不需要考虑节点的左子节点。右视图存储了所有那些是其所在层级的最后一个节点的节点。因此,我们可以

使用C++编写代码,找到具有相同最小值和最大值的子数组的数量使用C++编写代码,找到具有相同最小值和最大值的子数组的数量Aug 25, 2023 pm 11:33 PM

在本文中,我们将使用C++解决寻找最大值和最小值相同的子数组数量的问题。以下是该问题的示例&minus;Input:array={2,3,6,6,2,4,4,4}Output:12Explanation:{2},{3},{6},{6},{2},{4},{4},{4},{6,6},{4,4},{4,4}and{4,4,4}arethesubarrayswhichcanbeformedwithmaximumandminimumelementsame.Input:array={3,3,1,5,

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前By尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
4 週前By尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具