二元樹中等腰三角形的數量
二元樹是一種資料結構,其中每個節點最多可以有兩個子節點。這些孩子分別稱為左孩子和右孩子。假設我們得到了一個父數組表示,您必須使用它來建立一棵二元樹。二元樹可能有幾個等腰三角形。我們必須找到該二元樹中可能的等腰三角形的總數。
在本文中,我們將探討幾種在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中文網其他相關文章!

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

在準確率-召回率曲線上,同樣的點是用不同的座標軸繪製的。警告:左邊的第一個紅點(0%召回率,100%精確度)對應0條規則。左邊的第二個點是第一個規則,等等。 Skope-rules使用樹模型產生規則候選項。首先建立一些決策樹,並將從根節點到內部節點或葉節點的路徑視為規則候選項。然後透過一些預先定義的標準(如精確度和召回率)對這些候選規則進行過濾。只有那些精確度和召回率高於其閾值的才會被保留。最後,應用相似性過濾來選擇具有足夠多樣性的規則。一般情況下,應用Skope-rules來學習每個根本原因的

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

任務是列印給定二元樹的左節點。首先,使用者將插入數據,從而生成二元樹,然後列印所形成的樹的左側視圖。每個節點最多可以有2個子節點,因此這裡程式必須僅遍歷與節點關聯的左指針如果左指針不為空,則表示它將有一些與之關聯的資料或指針,否則它將是要列印並顯示為輸出的左子級。範例Input:10324Output:102這裡,橘色節點代表二元樹的左邊視圖。在給定的圖中,資料為1的節點是根節點,因此它將被列印,而不是轉到左子節點,它將列印0,然後它將轉到3並列印其左子節點,即2 。我們可以使用遞歸方法來儲存節點的級

二元樹是計算機科學中常見的資料結構,也是Java程式設計中常用的資料結構。本文將詳細介紹Java中的二元樹結構。一、什麼是二元樹?在電腦科學中,二元樹是一種樹狀結構,每個節點最多有兩個子節點。其中,左側子節點比父節點小,右側子節點比父節點大。在Java程式設計中,常用二元樹表示排序,搜尋以及提高對資料的查詢效率。二、Java中的二元樹實作在Java中,二元樹

在Java中,在執行時間傳遞參數的一種方法是使用命令列或終端機。在檢索命令列參數的這些值時,我們可能需要查找使用者在執行時間提供的參數數量,這可以藉助length屬性來實現。本文旨在藉助範例程式解釋傳遞和獲取使用者提供的參數數量的過程。在取得使用者在執行時提供的參數數量在尋找命令列參數的數量之前,我們的第一步是建立一個允許使用者在執行時間傳遞參數的程式。字串[]參數在寫Java程式時,我們經常遇到main()方法。當JVM呼叫此方法時,Java應用程式開始執行。它與一個名為String[]args的參數一起使

Linux指令是系統管理員日常工作中不可或缺的工具之一,它們可以幫助我們完成各種系統管理任務。在維運工作中,有時候需要查看系統中某個進程的數量以便及時發現問題和進行調優。本文將介紹如何使用Linux指令查看telnet進程的數量,讓我們一起來學習吧。在Linux系統中,我們可以使用ps指令結合grep指令來查看telnet進程的數量。首先,我們需要打開終端,

任務是列印給定二元樹的右節點。首先使用者將插入資料以建立二元樹,然後列印所形成的樹的右視圖。上圖展示了使用節點10、42、93、14、35、96、57和88建立的二元樹,其中選擇並顯示在樹的右側的節點。例如,10、93、57和88是二元樹的最右節點。範例Input:1042931435965788Output:10935788每個節點都有兩個指針,即左指針和右指針。根據這個問題,程式只需遍歷右節點。因此,不需要考慮節點的左子節點。右視圖儲存了所有那些是其所在層級的最後一個節點的節點。因此,我們可以

給定一個N叉樹,我們的任務是找到遍歷這棵樹的總方式數,例如−對於上面的樹,我們的輸出將是192。對於這個問題,我們需要一些組合學的知識。現在在這個問題中,我們只需要檢查每條路徑的所有可能組合,這將給我們答案。找到解決方案的方法在這個方法中,我們只需要執行一次層次遍歷,檢查每個節點有多少個子節點,然後將其階乘乘以答案。範例上述方法的C++程式碼#include<bits/stdc++.h>usingnamespacestd;structNode{//s
