이진 트리가 주어지면 작업은 트리의 높이를 찾는 것입니다. 트리의 높이는 루트에서 가장 깊은 노드까지 트리의 정점 수입니다.
메모: 빈 트리의 높이는 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_깊이를 반환합니다.
다음은 위의 접근 방식을 구현한 것입니다.
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>시간 복잡도: 에)
보조 공간: 에)다음을 사용하여 높이를 찾는 또 다른 방법 레벨 순서 순회 :
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>시간 복잡도: 에)
보조 공간: 에)