Raskite didžiausią tam tikro dvejetainio medžio gylį arba aukštį

Raskite didžiausią tam tikro dvejetainio medžio gylį arba aukštį

Pateiktas dvejetainis medis, užduotis yra rasti medžio aukštį. Medžio aukštis yra medžio viršūnių skaičius nuo šaknies iki giliausio mazgo.

Pastaba: Tuščio medžio aukštis yra 0 o medžio su vienu mazgu aukštis yra 1 .

Dvejetainio medžio pavyzdys

Dvejetainio medžio pavyzdys

Rekomenduojamas dvejetainio medžio aukštis Išbandykite!

Rekursyviai apskaičiuokite aukštį paliko ir teisingai mazgo pomedžiai ir priskirkite mazgo aukštį kaip maksimalus dviejų vaikų ūgis plius 1 . Daugiau informacijos rasite pseudo kodą ir programą.

Iliustracija:

Apsvarstykite šį medį:

Medžio pavyzdys

Medžio pavyzdys

maksimalus gylis('1') = max(maksimalus gylis('2'), maksimalus gylis('3')) + 1 = 2 + 1

nes rekursyviai
maxDepth('2') = max (maksimalus gylis('4'), maxDepth('5')) + 1 = 1 + 1 ir (kadangi ir '4', ir '5' aukštis yra 1)
maxDepth('3') = 1

Norėdami įgyvendinti idėją, atlikite šiuos veiksmus:

  • Rekursyviai atlikite paiešką pagal gylį.
  • Jei medis tuščias, grąžinkite 0
  • Kitu atveju atlikite šiuos veiksmus
    • Gaukite maksimalų kairiojo pomedžio gylį rekursyviai, t. y. iškvieskite maxDepth(medis->left-subtree)
    • Rekursyviai gaukite maksimalų dešiniojo pomedžio gylį, t. y. iškvieskite maxDepth (medis->dešinėlis-submedis)
    • Gaukite maksimalų maksimalų gylį paliko ir teisingai pomedžiai ir pridėti 1 į jį dabartiniam mazgui.
      • max_gylis = max(maksimalus kairiojo pomedžio gylis, maksimalus dešiniojo pomedžio gylis) + 1
  • Grąžinimo maks._gylis.

Toliau pateikiamas pirmiau minėto metodo įgyvendinimas:

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->kairėje);> > int> rDepth = maxDepth(node->dešinėje);> > /* use the larger one */> > if> (lDepth>rGylis)> > 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->duomenys = duomenys;> > Node->left = NULL;> > Node->dešinė = NULL;> > return> (Node);> }> // Driver code> int> main()> {> > node* root = newNode(1);> > root->left = newNode(2);> > root->dešinė = newMagas(3);> > root->left->left = naujasMazgas(4);> > root->kairė->dešinė = naujasMazgas(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->kairėje);> > int> rDepth = maxDepth(node->dešinėje);> > /* 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->duomenys = duomenys;> > node->left = NULL;> > node->dešinė = NULL;> > return> (node);> }> int> main()> {> > struct> node* root = newNode(1);> > root->left = newNode(2);> > root->dešinė = newMagas(3);> > root->left->left = naujasMazgas(4);> > root->kairė->dešinė = naujasMazgas(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>rGylis)> > 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> >

Išvestis
Height of tree is 3 

Laiko sudėtingumas: O (N) (Žiūrėkite įrašą Medžių perėjimas dėl informacijos)
Pagalbinė erdvė: O(N) dėl rekursinio krūvos.

Raskite maksimalų medžio gylį arba aukštį naudodami Lygio tvarka :

Daryk Lygio tvarka , pridedant mazgus kiekviename lygyje Norėdami įgyvendinti idėją, atlikite šiuos veiksmus:

  • Pereikite medį lygia tvarka, pradedant nuo šaknis .
    • Inicijuoti tuščią eilę K , kintamasis gylis ir stumti šaknis , tada stumkite nulinis į K .
    • Truputį paleiskite kilpą, kol K nėra tuščias.
      • Laikykite priekinį elementą K ir iškelkite priekinį elementą.
      • Jei priekinė dalis K yra NULL tada padidinkite gylis po vieną ir jei eilė nėra tuščia, tada stumkite NULL į K .
      • Kitu atveju, jei elemento nėra NULL tada patikrinkite, ar jis yra paliko ir teisingai vaikai, o jei jų nėra NULL stumti juos į K .
  • Grįžti gylis .

Toliau pateikiamas pirmiau minėto metodo įgyvendinimas:

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->raktas = raktas;> > temp->kairėje = ​​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->kairėje) {> > q.push(temp->kairėje);> > }> > if> (temp->dešinėje) {> > q.push(temp->dešinėje);> > }> > }> > // 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->left = newNode(2);> > root->dešinė = newMagas(3);> > root->left->left = naujasMazgas(4);> > root->kairė->dešinė = naujasMazgas(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> >

Išvestis
Height(Depth) of tree is: 3 

Laiko sudėtingumas: O(N)
Pagalbinė erdvė: O(N)

Kitas būdas nustatyti aukštį naudojant Lygio tvarka :

Šis metodas taip pat naudoja Lygio užsakymo perėjimo koncepciją, bet mes į eilę neįtrauksime nulio. Tiesiog padidinkite skaitiklis lygiui padidėjus ir į eilę įstumkite dabartinio mazgo vaikus, tada pašalinkite visus mazgus iš dabartinio lygio eilės.

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->raktas = raktas;> > temp->kairėje = ​​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->left != NULL) { q.push(temp->left); } if (temp->right != NULL) { q.push(temp->right); } } aukštis++; } grąžinimo aukštis; } // Tvarkyklės programa int main() { // Sukurkime dvejetainį medį, parodytą aukščiau esančiame pavyzdyje Node* root = newNode(1); root->left = naujasMazgas(2); root->right = naujasMazgas(3); šaknis->kairė->kairė = naujasMazgas(4); šaknis->kairė->dešinė = newMagas(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)>

Išvestis
Height(Depth) of tree is: 3 

Laiko sudėtingumas: O(N)
Pagalbinė erdvė: O(N)