Atrodiet dotā binārā koka maksimālo dziļumu vai augstumu
Dots binārs koks, uzdevums ir atrast koka augstumu. Koka augstums ir virsotņu skaits kokā no saknes līdz dziļākajam mezglam.
Piezīme: Tukša koka augstums ir 0 un koka ar vienu mezglu augstums ir 1 .
Binārā koka piemērs
Ieteicamais binārā koka prakses augstums Izmēģiniet to!Rekursīvi aprēķiniet augstumu pa kreisi un pa labi mezgla apakškokus un piešķir mezglam augstumu kā Maksimālais divu bērnu augums plus 1 . Plašāku informāciju skatiet tālāk pseido kodu un programmu.
Ilustrācija:
Apsveriet šādu koku:
![]()
Koka piemērs
maks.Dziļums('1') = maks(maksimālaisDziļums('2'), maxDepth('3')) + 1 = 2 + 1
jo rekursīvi
maxDepth('2') = max (maxDepth('4'), maxDepth('5')) + 1 = 1 + 1 un (jo gan '4', gan '5' augstums ir 1)
maxDepth('3') = 1
Lai īstenotu ideju, veiciet tālāk norādītās darbības.
- Rekursīvi veiciet meklēšanu pēc dziļuma.
- Ja koks ir tukšs, atgrieziet 0
- Pretējā gadījumā rīkojieties šādi
- Rekursīvi iegūstiet kreisā apakškoka maksimālo dziļumu, t.i., izsauciet maxDepth(koks->kreisais apakškoks)
- Rekursīvi iegūstiet īstā apakškoka maksimālo dziļumu, t.i., izsauciet maxDepth(koks->labais-apakškoks)
- Iegūstiet maksimālo maksimālo dziļumu pa kreisi un pa labi apakškoki un pievienot 1 uz to pašreizējam mezglam.
-
- Atgriezties max_depth.
Zemāk ir aprakstīta iepriekš minētās pieejas īstenošana:
C++
// C++ program to find height of tree> #include> using> namespace> std;> /* A binary tree node has data, pointer to left child> and a pointer to right child */> class> node {> public> :> > int> data;> > node* left;> > node* right;> };> /* Compute the 'maxDepth' of a tree -- the number of> > nodes along the longest path from the root node> > down to the farthest leaf node.*/> int> maxDepth(node* node)> {> > if> (node == NULL)> > return> 0;> > else> {> > /* compute the depth of each subtree */> > int> lDepth = maxDepth(node->pa kreisi);> > int> rDepth = maxDepth(node->pa labi);> > /* use the larger one */> > if> (lDepth>rDepth)> > return> (lDepth + 1);> > else> > return> (rDepth + 1);> > }> }> /* Helper function that allocates a new node with the> given data and NULL left and right pointers. */> node* newNode(> int> data)> {> > node* Node => new> node();> > Node->dati = dati;> > Node->pa kreisi = NULL;> > Node->pa labi = NULL;> > return> (Node);> }> // Driver code> int> main()> {> > node* root = newNode(1);> > root->pa kreisi = newNode(2);> > root->pa labi = newNode(3);> > root->pa kreisi->pa kreisi = newNode(4);> > root->pa kreisi->pa labi = newNode(5);> > cout < <> 'Height of tree is '> < < maxDepth(root);> > return> 0;> }> // This code is contributed by Amit Srivastav> |
C
#include> #include> /* A binary tree node has data, pointer to left child> > and a pointer to right child */> struct> node {> > int> data;> > struct> node* left;> > struct> node* right;> };> /* Compute the 'maxDepth' of a tree -- the number of> > nodes along the longest path from the root node> > down to the farthest leaf node.*/> int> maxDepth(> struct> node* node)> {> > if> (node == NULL)> > return> 0;> > else> {> > /* compute the depth of each subtree */> > int> lDepth = maxDepth(node->pa kreisi);> > int> rDepth = maxDepth(node->pa labi);> > /* use the larger one */> > if> (lDepth>rDepth)> > return> (lDepth + 1);> > else> > return> (rDepth + 1);> > }> }> /* Helper function that allocates a new node with the> > given data and NULL left and right pointers. */> struct> node* newNode(> int> data)> {> > struct> node* node> > = (> struct> node*)> malloc> (> sizeof> (> struct> node));> > node->dati = dati;> > node->pa kreisi = NULL;> > node->pa labi = NULL;> > return> (node);> }> int> main()> {> > struct> node* root = newNode(1);> > root->pa kreisi = newNode(2);> > root->pa labi = newNode(3);> > root->pa kreisi->pa kreisi = newNode(4);> > root->pa kreisi->pa labi = newNode(5);> > printf> (> 'Height of tree is %d'> , maxDepth(root));> > getchar> ();> > return> 0;> }> |
Java
// Java program to find height of tree> // A binary tree node> class> Node {> > int> data;> > Node left, right;> > Node(> int> item)> > {> > data = item;> > left = right => null> ;> > }> }> class> BinaryTree {> > Node root;> > /* Compute the 'maxDepth' of a tree -- the number of> > nodes along the longest path from the root node> > down to the farthest leaf node.*/> > int> maxDepth(Node node)> > {> > if> (node ==> null> )> > return> 0> ;> > else> {> > /* compute the depth of each subtree */> > int> lDepth = maxDepth(node.left);> > int> rDepth = maxDepth(node.right);> > /* use the larger one */> > if> (lDepth>rDepth)> > return> (lDepth +> 1> );> > else> > return> (rDepth +> 1> );> > }> > }> > /* Driver program to test above functions */> > public> static> void> main(String[] args)> > {> > BinaryTree tree => new> BinaryTree();> > tree.root => new> Node(> 1> );> > tree.root.left => new> Node(> 2> );> > tree.root.right => new> Node(> 3> );> > tree.root.left.left => new> Node(> 4> );> > tree.root.left.right => new> Node(> 5> );> > System.out.println(> 'Height of tree is '> > + tree.maxDepth(tree.root));> > }> }> // This code has been contributed by Amit Srivastav> |
Python3
# Python3 program to find the maximum depth of tree> # A binary tree node> class> Node:> > # Constructor to create a new node> > def> __init__(> self> , data):> > self> .data> => data> > self> .left> => None> > self> .right> => None> # Compute the 'maxDepth' of a tree -- the number of nodes> # along the longest path from the root node down to the> # farthest leaf node> def> maxDepth(node):> > if> node> is> None> :> > return> 0> > else> :> > # Compute the depth of each subtree> > lDepth> => maxDepth(node.left)> > rDepth> => maxDepth(node.right)> > # Use the larger one> > if> (lDepth>rDepth):> > return> lDepth> +> 1> > else> :> > return> rDepth> +> 1> # Driver program to test above function> root> => Node(> 1> )> root.left> => Node(> 2> )> root.right> => Node(> 3> )> root.left.left> => Node(> 4> )> root.left.right> => Node(> 5> )> print> (> 'Height of tree is %d'> %> (maxDepth(root)))> # This code is contributed by Amit Srivastav> |
C#
// C# program to find height of tree> using> System;> // A binary tree node> public> class> Node {> > public> int> data;> > public> Node left, right;> > public> Node(> int> item)> > {> > data = item;> > left = right => null> ;> > }> }> public> class> BinaryTree {> > Node root;> > /* Compute the 'maxDepth' of a tree -- the number of> > nodes along the longest path from the root node> > down to the farthest leaf node.*/> > int> maxDepth(Node node)> > {> > if> (node ==> null> )> > return> 0;> > else> {> > /* compute the depth of each subtree */> > int> lDepth = maxDepth(node.left);> > int> rDepth = maxDepth(node.right);> > /* use the larger one */> > if> (lDepth>rDepth)> > return> (lDepth + 1);> > else> > return> (rDepth + 1);> > }> > }> > /* Driver code */> > public> static> void> Main(String[] args)> > {> > BinaryTree tree => new> BinaryTree();> > tree.root => new> Node(1);> > tree.root.left => new> Node(2);> > tree.root.right => new> Node(3);> > tree.root.left.left => new> Node(4);> > tree.root.left.right => new> Node(5);> > Console.WriteLine(> 'Height of tree is '> > + tree.maxDepth(tree.root));> > }> }> // This code has been contributed by> // Correction done by Amit Srivastav> |
Javascript
> // JavaScript program to find height of tree> // A binary tree node> class Node> {> > constructor(item)> > {> > this> .data=item;> > this> .left=> this> .right=> null> ;> > }> }> > let root;> > > /* Compute the 'maxDepth' of a tree -- the number of> > nodes along the longest path from the root node> > down to the farthest leaf node.*/> > function> maxDepth(node)> > {> > if> (node ==> null> )> > return> 0;> > else> > {> > /* compute the depth of each subtree */> > let lDepth = maxDepth(node.left);> > let rDepth = maxDepth(node.right);> > > /* use the larger one */> > if> (lDepth>rDepth)> > return> (lDepth + 1);> > else> > return> (rDepth + 1);> > }> > }> > > /* Driver program to test above functions */> > > root => new> Node(1);> > root.left => new> Node(2);> > root.right => new> Node(3);> > root.left.left => new> Node(4);> > root.left.right => new> Node(5);> > > document.write(> 'Height of tree is : '> +> > maxDepth(root));> // This code is contributed by rag2127> //Correction done by Amit Srivastav> > |
Izvade
Height of tree is 3
Laika sarežģītība: O(N) (Lūdzu, skatiet ziņu vietnē Koku šķērsošana sīkākai informācijai)
Palīgtelpa: O(N) rekursīvās steka dēļ.
Atrodiet koka maksimālo dziļumu vai augstumu, izmantojot Līmeņa pasūtījumu izbraukšana :
Dariet Līmeņa pasūtījumu izbraukšana , vienlaikus pievienojot mezglus katrā līmenī Lai īstenotu ideju, veiciet tālāk norādītās darbības.
- Šķērsojiet koku līmenī, šķērsojot, sākot no sakne .
- Inicializējiet tukšu rindu J , mainīgais dziļums un spiediet sakne , pēc tam nospiediet null iekšā J .
- Palaidiet kamēr cilpa līdz J nav tukšs.
- Uzglabājiet priekšējo elementu J un Izvelciet priekšējo elementu.
- Ja priekšpuse J ir NULL tad palielinājums dziļums pa vienam un, ja rinda nav tukša, tad spiediet NULL iekšā J .
- Citādi, ja elements nav NULL tad pārbaudiet to pa kreisi un pa labi bērni un ja tādi nav NULL iespiediet tos J .
- Atgriezties dziļums .
Zemāk ir aprakstīta iepriekš minētās pieejas īstenošana:
C++
#include>#include>using>namespace>std;>// A Tree node>struct>Node {>>int>key;>>struct>Node *left, *right;>};>// Utility function to create a new node>Node* newNode(>int>key)>{>>Node* temp =>new>Node;>>temp->taustiņš = atslēga;>>temp->pa kreisi = temp->right = NULL;>>return>(temp);>}>/*Function to find the height(depth) of the tree*/>int>height(>struct>Node* root)>{>>// Initialising a variable to count the>>// height of tree>>int>depth = 0;>>queue q;>>// Pushing first level element along with NULL>>q.push(root);>>q.push(NULL);>>while>(!q.empty()) {>>Node* temp = q.front();>>q.pop();>>// When NULL encountered, increment the value>>if>(temp == NULL) {>>depth++;>>}>>// If NULL not encountered, keep moving>>if>(temp != NULL) {>>if>(temp->pa kreisi) {>>q.push(temp->pa kreisi);>>}>>if>(temp->pa labi) {>>q.push(temp->pa labi);>>}>>}>>// If queue still have elements left,>>// push NULL again to the queue.>>else>if>(!q.empty()) {>>q.push(NULL);>>}>>}>>return>depth;>}>// Driver program>int>main()>{>>// Let us create Binary Tree shown in above example>>Node* root = newNode(1);>>root->pa kreisi = newNode(2);>>root->pa labi = newNode(3);>>root->pa kreisi->pa kreisi = newNode(4);>>root->pa kreisi->pa labi = newNode(5);>>cout < <>'Height(Depth) of tree is: '>< < height(root);>}>Java
// Java program for above approach>import>java.util.LinkedList;>import>java.util.Queue;>class>GFG {>>// A tree node structure>>static>class>Node {>>int>key;>>Node left;>>Node right;>>}>>// Utility function to create>>// a new node>>static>Node newNode(>int>key)>>{>>Node temp =>new>Node();>>temp.key = key;>>temp.left = temp.right =>null>;>>return>temp;>>}>>/*Function to find the height(depth) of the tree*/>>public>static>int>height(Node root)>>{>>// Initialising a variable to count the>>// height of tree>>int>depth =>0>;>>Queue q =>new>LinkedList();>>// Pushing first level element along with null>>q.add(root);>>q.add(>null>);>>while>(!q.isEmpty()) {>>Node temp = q.peek();>>q.remove();>>// When null encountered, increment the value>>if>(temp ==>null>) {>>depth++;>>}>>// If null not encountered, keep moving>>if>(temp !=>null>) {>>if>(temp.left !=>null>) {>>q.add(temp.left);>>}>>if>(temp.right !=>null>) {>>q.add(temp.right);>>}>>}>>// If queue still have elements left,>>// push null again to the queue.>>else>if>(!q.isEmpty()) {>>q.add(>null>);>>}>>}>>return>depth;>>}>>// Driver Code>>public>static>void>main(String args[])>>{>>Node root = newNode(>1>);>>root.left = newNode(>2>);>>root.right = newNode(>3>);>>root.left.left = newNode(>4>);>>root.left.right = newNode(>5>);>>System.out.println(>'Height(Depth) of tree is: '>>+ height(root));>>}>}>// This code is contributed by jana_sayantan.>Python3
# Python code to implement the approach># A Tree node>class>Node:>>def>__init__(>self>):>>self>.key>=>0>>self>.left,>self>.right>=>None>,>None># Utility function to create a new node>def>newNode(key):>>temp>=>Node()>>temp.key>=>key>>temp.left, temp.right>=>None>,>None>>return>temp># Function to find the height(depth) of the tree>def>height(root):>># Initialising a variable to count the>># height of tree>>depth>=>0>>q>=>[]>># appending first level element along with None>>q.append(root)>>q.append(>None>)>>while>(>len>(q)>>>):>>q.append(>None>)>>return>depth># Driver program># Let us create Binary Tree shown in above example>root>=>newNode(>1>)>root.left>=>newNode(>2>)>root.right>=>newNode(>3>)>root.left.left>=>newNode(>4>)>root.left.right>=>newNode(>5>)>print>(f>'Height(Depth) of tree is: {height(root)}'>)># This code is contributed by shinjanpatra>C#
// C# Program to find the Maximum Depth or Height of Binary Tree>using>System;>using>System.Collections.Generic;>// A Tree node>public>class>Node {>>public>int>data;>>public>Node left, right;>>public>Node(>int>item)>>{>>data = item;>>left =>null>;>>right =>null>;>>}>}>public>class>BinaryTree {>>Node root;>>// Function to find the height(depth) of the tree>>int>height()>>{>>// Initialising a variable to count the>>// height of tree>>int>depth = 0;>>Queue q =>new>Queue();>>// Pushing first level element along with NULL>>q.Enqueue(root);>>q.Enqueue(>null>);>>while>(q.Count != 0) {>>Node temp = q.Dequeue();>>// When NULL encountered, increment the value>>if>(temp ==>null>)>>depth++;>>// If NULL not encountered, keep moving>>if>(temp !=>null>) {>>if>(temp.left !=>null>) {>>q.Enqueue(temp.left);>>}>>if>(temp.right !=>null>) {>>q.Enqueue(temp.right);>>}>>}>>// If queue still have elements left,>>// push NULL again to the queue>>else>if>(q.Count != 0) {>>q.Enqueue(>null>);>>}>>}>>return>depth;>>}>>// Driver program>>public>static>void>Main()>>{>>// Let us create Binary Tree shown in above example>>BinaryTree tree =>new>BinaryTree();>>tree.root =>new>Node(1);>>tree.root.left =>new>Node(2);>>tree.root.right =>new>Node(3);>>tree.root.left.left =>new>Node(4);>>tree.root.left.right =>new>Node(5);>>Console.WriteLine(>'Height(Depth) of tree is: '>>+ tree.height());>>}>}>// This code is contributed by Yash Agarwal(yashagarwal2852002)>Javascript
>// JavaScript code to implement the approach>// A Tree node>class Node{>>constructor(){>>this>.key = 0>>this>.left =>null>>this>.right =>null>>}>}>// Utility function to create a new node>function>newNode(key){>>let temp =>new>Node()>>temp.key = key>>temp.left =>null>>temp.right =>null>>return>temp>}>// Function to find the height(depth) of the tree>function>height(root){>>// Initialising a variable to count the>>// height of tree>>let depth = 0>>let q = []>>>// pushing first level element along with null>>q.push(root)>>q.push(>null>)>>while>(q.length>0){>>let temp = q.shift()>>>// When null encountered, increment the value>>if>(temp ==>null>)>>depth += 1>>>// If null not encountered, keep moving>>if>(temp !=>null>){>>if>(temp.left)>>q.push(temp.left)>>>if>(temp.right)>>q.push(temp.right)>>}>>>// If queue still have elements left,>>// push null again to the queue.>>else>if>(q.length>0)>>q.push(>null>)>>}>>return>depth>}>// Driver program>// Let us create Binary Tree shown in above example>let root = newNode(1)>root.left = newNode(2)>root.right = newNode(3)>root.left.left = newNode(4)>root.left.right = newNode(5)>document.write(`Height(Depth) of tree is: ${height(root)}`,>''>)>// This code is contributed by shinjanpatra>>
IzvadeHeight(Depth) of tree is: 3Laika sarežģītība: O(N)
Palīgtelpa: O(N)Vēl viena metode augstuma noteikšanai, izmantojot Līmeņa pasūtījumu izbraukšana :
C++
// C++ program for above approach>#include>using>namespace>std;>// A Tree node>struct>Node {>>int>key;>>struct>Node *left, *right;>};>// Utility function to create a new node>Node* newNode(>int>key)>{>>Node* temp =>new>Node;>>temp->taustiņš = atslēga;>>temp->pa kreisi = temp->right = NULL;>>return>(temp);>}>/*Function to find the height(depth) of the tree*/>int>height(Node* root)>{>>// Initialising a variable to count the>>// height of tree>>queue q;>>q.push(root);>>int>height = 0;>>while>(!q.empty()) {>>int>size = q.size();>>for>(>int>i = 0; i Node* temp = q.front(); q.pop(); if (temp->pa kreisi != NULL) { q.push(temp->left); } if (temp->right != NULL) { q.push(temp->right); } } augstums++; } atgriešanas augstums; } // Draivera programma int main() { // Izveidosim bināro koku, kas parādīts augstāk esošajā piemērā Node* root = newNode(1); sakne->pa kreisi = newNode(2); sakne->pa labi = newNode(3); sakne->pa kreisi->pa kreisi = newNode(4); sakne->pa kreisi->pa labi = newNode(5); cout < < 'Height(Depth) of tree is: ' < < height(root); } // This code is contributed by Abhijeet Kumar(abhijeet19403)>Java
// Java program for above approach>import>java.util.LinkedList;>import>java.util.Queue;>class>GFG {>>// A tree node structure>>static>class>Node {>>int>key;>>Node left;>>Node right;>>}>>// Utility function to create>>// a new node>>static>Node newNode(>int>key)>>{>>Node temp =>new>Node();>>temp.key = key;>>temp.left = temp.right =>null>;>>return>temp;>>}>>/*Function to find the height(depth) of the tree*/>>public>static>int>height(Node root)>>{>>// Initialising a variable to count the>>// height of tree>>Queue q =>new>LinkedList();>>q.add(root);>>int>height =>0>;>>while>(!q.isEmpty()) {>>int>size = q.size();>>for>(>int>i =>0>; i Node temp = q.poll(); if (temp.left != null) { q.add(temp.left); } if (temp.right != null) { q.add(temp.right); } } height++; } return height; } // Driver Code public static void main(String args[]) { Node root = newNode(1); root.left = newNode(2); root.right = newNode(3); root.left.left = newNode(4); root.left.right = newNode(5); System.out.println('Height(Depth) of tree is: ' + height(root)); } }>Python3
# Python3 program to find the height of a tree>># A binary tree node>class>Node:>>># Constructor to create a new node>>def>__init__(>self>, data):>>self>.key>=>data>>self>.left>=>None>>self>.right>=>None>># Function to find height of tree>def>height(root):>># Base Case>>if>root>is>None>:>>return>0>>># Create an empty queue for level order traversal>>q>=>[]>>># Enqueue Root and initialize height>>q.append(root)>>height>=>0>>># Loop while queue is not empty>>while>q:>>># nodeCount (queue size) indicates number of nodes>># at current level>>nodeCount>=>len>(q)>>># Dequeue all nodes of current level and Enqueue all>># nodes of next level>>while>nodeCount>>>, height(root))>C#
using>System;>using>System.Collections.Generic;>class>GFG {>>// A Tree node>>class>Node {>>public>int>key;>>public>Node left, right;>>public>Node(>int>key)>>{>>this>.key=key;>>this>.left=>this>.right=>null>;>>}>>}>>// Utility function to create a new node>>/*Node newNode(int key)>>{>>Node* temp = new Node;>>temp.key = key;>>temp.left = temp.right = NULL;>>return (temp);>>}*/>>/*Function to find the height(depth) of the tree*/>>static>int>height(Node root)>>{>>// Initialising a variable to count the>>// height of tree>>Queue q=>new>Queue();>>q.Enqueue(root);>>int>height = 0;>>while>(q.Count>0) {>>int>size = q.Count;>>for>(>int>i = 0; i Node temp = q.Peek(); q.Dequeue(); if (temp.left != null) { q.Enqueue(temp.left); } if (temp.right != null) { q.Enqueue(temp.right); } } height++; } return height; } // Driver program public static void Main() { // Let us create Binary Tree shown in above example Node root = new Node(1); root.left = new Node(2); root.right = new Node(3); root.left.left = new Node(4); root.left.right = new Node(5); Console.Write('Height(Depth) of tree is: ' + height(root)); } } // This code is contributed by poojaagarwal2.>Javascript
// JavaScript program for above approach>// a tree node>class Node{>>constructor(key){>>this>.key = key;>>this>.left =>this>.right =>null>;>>}>}>// utility function to create a new node>function>newNode(key){>>return>new>Node(key);>}>// function to find the height of the tree>function>height(root){>>// initialising a variable to count the>>// height of tree>>let q = [];>>q.push(root);>>let height = 0;>>while>(q.length>0){>>let size = q.length;>>for>(let i = 0; i let temp = q.shift(); if(temp.left != null){ q.push(temp.left); } if(temp.right != null){ q.push(temp.right); } } height++; } return height; } // driver code let root = newNode(1); root.left = newNode(2); root.right = newNode(3); root.left.left = newNode(4); root.left.right = newNode(5); document.write('Height(Depth) of tree is: ' + height(root)); // this code is contributed by Kirti Agarwal(kirtiagarwal23121999)>
IzvadeHeight(Depth) of tree is: 3Laika sarežģītība: O(N)
Palīgtelpa: O(N)