주어진 이진 트리의 최대 깊이 또는 높이 찾기

주어진 이진 트리의 최대 깊이 또는 높이 찾기

이진 트리가 주어지면 작업은 트리의 높이를 찾는 것입니다. 트리의 높이는 루트에서 가장 깊은 노드까지 트리의 정점 수입니다.

메모: 빈 트리의 높이는 0 단일 노드가 있는 트리의 높이는 다음과 같습니다. 1 .

이진 트리의 예

이진 트리의 예

이진트리의 권장 연습 높이 사용해 보세요!

재귀적으로 높이를 계산한다. 왼쪽 그리고 오른쪽 노드의 하위 트리를 만들고 노드에 높이를 다음과 같이 할당합니다. 두 아이의 최대 키에 1을 더한 것 . 자세한 내용은 아래 의사 코드 및 프로그램을 참조하세요.

삽화:

다음 트리를 고려해보세요.

트리의 예

트리의 예

maxDepth('1') = max(maxDepth('2'), maxDepth('3')) + 1 = 2 + 1

왜냐하면 재귀적으로
maxDepth('2') = max (maxDepth('4'), maxDepth('5')) + 1 = 1 + 1 및 ('4'와 '5'의 높이는 모두 1이므로)
최대 깊이('3') = 1

아이디어를 구현하려면 아래 단계를 따르십시오.

  • 재귀적으로 깊이 우선 검색을 수행합니다.
  • 트리가 비어 있으면 0을 반환합니다.
  • 그렇지 않으면 다음을 수행하십시오.
    • 왼쪽 하위 트리의 최대 깊이를 재귀적으로 가져옵니다. 즉, maxDepth(tree->left-subtree)를 호출합니다.
    • 오른쪽 하위 트리의 최대 깊이를 재귀적으로 가져옵니다. 즉, maxDepth(tree->right-subtree)를 호출합니다.
    • 최대 깊이의 최대값을 얻으세요. 왼쪽 그리고 오른쪽 하위 트리 및 1을 더하다 현재 노드에 대해.
      • max_length = max(왼쪽 하위 트리의 최대 깊이, 오른쪽 하위 트리의 최대 깊이) + 1
  • max_깊이를 반환합니다.

다음은 위의 접근 방식을 구현한 것입니다.

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->왼쪽);> > int> rDepth = maxDepth(node->오른쪽);> > /* use the larger one */> > if> (lDepth>r깊이)> > 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->데이터 = 데이터;> > Node->왼쪽 = NULL;> > Node->오른쪽 = NULL;> > return> (Node);> }> // Driver code> int> main()> {> > node* root = newNode(1);> > root->왼쪽 = newNode(2);> > root->오른쪽 = newNode(3);> > root->왼쪽->왼쪽 = newNode(4);> > root->왼쪽->오른쪽 = newNode(5);> > cout < <> 'Height of tree is '> < < maxDepth(root);> > return> 0;> }> // This code is contributed by Amit Srivastav>

#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->왼쪽);> > int> rDepth = maxDepth(node->오른쪽);> > /* use the larger one */> > if> (lDepth>r깊이)> > 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->데이터 = 데이터;> > node->왼쪽 = NULL;> > node->오른쪽 = NULL;> > return> (node);> }> int> main()> {> > struct> node* root = newNode(1);> > root->왼쪽 = newNode(2);> > root->오른쪽 = newNode(3);> > root->왼쪽->왼쪽 = newNode(4);> > root->왼쪽->오른쪽 = newNode(5);> > printf> (> 'Height of tree is %d'> , maxDepth(root));> > getchar> ();> > return> 0;> }>

자바

// 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>r깊이)> > 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>

파이썬3

# 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>r깊이):> > 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# 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>r깊이)> > 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 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>r깊이)> > 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> >

산출
Height of tree is 3 

시간 복잡도: O(N) (아래 포스팅을 참고해주세요) 트리 순회 자세한 내용은)
보조 공간: 재귀 스택으로 인해 O(N)입니다.

다음을 사용하여 나무의 최대 깊이 또는 높이 찾기 레벨 순서 순회 :

하다 레벨 순서 순회 , 각 수준의 노드를 추가하는 동안 아이디어를 구현하려면 아래 단계를 따르십시오.

  • 다음에서 시작하여 레벨 순서 탐색으로 트리를 탐색합니다. 뿌리 .
    • 빈 대기열 초기화 , 변수 깊이 그리고 밀어 뿌리 , 그런 다음 푸시 없는 .
    • while 루프를 실행하십시오. 비어 있지 않습니다.
      • 의 앞부분 요소를 저장합니다. 전면 요소를 팝아웃합니다.
      • 앞의 경우 ~이다 없는 그런 다음 증가 깊이 하나씩 그리고 대기열이 비어 있지 않으면 푸시합니다. 없는 .
      • 그렇지 않으면 요소가 그렇지 않은 경우 없는 그런 다음 확인해 보세요. 왼쪽 그리고 오른쪽 아이들이고 그렇지 않다면 없는 그들을 밀어 넣다 .
  • 반품 깊이 .

다음은 위의 접근 방식을 구현한 것입니다.

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->키 = 키;> > temp->왼쪽 = 임시->오른쪽 = 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->왼쪽) {> > q.push(temp->왼쪽);> > }> > if> (temp->오른쪽) {> > q.push(temp->오른쪽);> > }> > }> > // 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->왼쪽 = newNode(2);> > root->오른쪽 = newNode(3);> > root->왼쪽->왼쪽 = newNode(4);> > root->왼쪽->오른쪽 = newNode(5);> > cout < <> 'Height(Depth) of tree is: '> < < height(root);> }>

자바

// 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.>

파이썬3

# 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)>> 0> ):> > temp> => q[> 0> ]> > q> => q[> 1> :]> > # When None encountered, increment the value> > if> (temp> => => None> ):> > depth> +> => 1> > # If None not encountered, keep moving> > if> (temp !> => None> ):> > if> (temp.left):> > q.append(temp.left)> > if> (temp.right):> > q.append(temp.right)> > # If queue still have elements left,> > # append None again to the queue.> > elif> (> len> (q)>> 0> ):> > 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# 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 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> >

산출
Height(Depth) of tree is: 3 

시간 복잡도: 에)
보조 공간: 에)

다음을 사용하여 높이를 찾는 또 다른 방법 레벨 순서 순회 :

이 방법은 또한 Level Order Traversal 개념을 사용하지만 대기열에 null을 추가하지 않습니다. 간단히 늘리세요. 카운터 레벨이 증가하고 현재 노드의 하위 노드를 큐에 밀어 넣은 다음 현재 레벨의 큐에서 모든 노드를 제거합니다.

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->키 = 키;> > temp->왼쪽 = 임시->오른쪽 = 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->왼쪽 != NULL) { q.push(temp->left); } if (temp->right != NULL) { q.push(temp->right); } } 높이++; } 반환 높이; } // 드라이버 프로그램 int main() { // 위의 예에 표시된 이진 트리를 생성해 보겠습니다. Node* root = newNode(1); 루트->왼쪽 = newNode(2); 루트->오른쪽 = newNode(3); 루트->왼쪽->왼쪽 = newNode(4); 루트->왼쪽->오른쪽 = newNode(5); 시합 < < 'Height(Depth) of tree is: ' < < height(root); } // This code is contributed by Abhijeet Kumar(abhijeet19403)>

자바

// 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)); } }>

파이썬3

# 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>> 0> :> > node> => q.pop(> 0> )> > if> node.left> is> not> None> :> > q.append(node.left)> > if> node.right> is> not> None> :> > q.append(node.right)> > nodeCount> -> => 1> > height> +> => 1> > > return> height> > # Driver Code> root> => Node(> 1> )> root.left> => Node(> 2> )> root.right> => Node(> 3> )> root.left.left> => Node(> 4> )> root.left.right> => Node(> 5> )> > print> (> 'Height(Depth) of tree is'> , height(root))>

씨#

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 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)>

산출
Height(Depth) of tree is: 3 

시간 복잡도: 에)
보조 공간: 에)