logo

이진 트리의 높이

이진 트리의 높이 또는 깊이는 리프 노드에서 루트 노드까지 또는 루트 노드에서 리프 노드까지의 간선의 최대 또는 최대 개수로 정의할 수 있습니다. 루트 노드는 레벨 0이 됩니다. 즉, 루트 노드에 연결된 자식 노드가 하나도 없으면 특정 이진 트리의 높이나 깊이가 0이라고 합니다.

이진 트리의 높이를 더 잘 이해하기 위해 예를 들어 보겠습니다.

이진 트리의 높이

위 이미지에는 A라는 루트 노드에서 시작하는 이진 트리가 있습니다. 루트 노드 A에는 각각 왼쪽 자식과 오른쪽 자식으로 두 개의 자식 노드 B와 C가 있습니다. 마찬가지로 왼쪽 자식 노드 B에는 D라는 이름의 왼쪽 자식 노드가 하나만 있고 오른쪽 자식 노드 C에는 두 개의 자식 노드 E와 F가 있으며, 노드 E에는 노드 G가 유일한 왼쪽 자식으로 있습니다.

루프용 자바스크립트

이제 이 이진 트리의 높이를 계산해 보겠습니다. 이진 트리의 높이를 계산하기 위해 루트 노드부터 시작하여 가장 깊은 리프 노드까지의 간선 수를 계산합니다. 이 이진 트리에 존재하는 가장 깊은 노드는 노드 G입니다. 따라서 이 이진 트리의 높이 또는 깊이를 계산하려면 루트 노드와 가장 깊은 노드 G 사이의 가장자리 수를 계산해야 합니다. 첫 번째 가장자리 노드 A에서 노드 C까지이고, 두 번째 에지는 노드 C에서 노드 E까지이고, 세 번째 에지는 노드 E에서 노드 G까지입니다. 따라서 루트 노드 A에서 가장 깊은 노드 G까지 이동하려면 세 개의 에지가 있습니다. , 따라서 이진 트리의 높이 또는 깊이는 3입니다. 루트에서 가장 깊은 리프 노드로 이동하기 위해 따라온 경로는 A > C > E > G이며 이 경로는 순회 중에 세 개의 가장자리를 포함합니다. 이진 트리의 높이 정의에 따르면 이 이진 트리의 높이는 3입니다.

이진 트리의 높이를 찾는 방법

이제 이진 트리의 높이를 구하는 코드를 작성해 보겠습니다. 이진 트리의 높이를 찾는 방법에는 두 가지가 있습니다. 하나는 재귀적 방법 그리고 다른 하나는 비재귀적 방법 이는 큐 데이터 구조를 사용하여 이진 트리의 높이를 계산합니다.

재귀적 방식

먼저 이진 트리의 높이를 찾는 재귀적 방법을 살펴보겠습니다.

암호:

 // Java program to create and to find the height of a binary tree by recursive way // util package is imported to use classes like Queue and LinkedList import java.util.*; // A class named Node is created representing a single node of a binary tree class Node{ // The class Node has three class variables named key and left and right of int type and Node type respectively. // the key variable holds the actual value that is assigned to that node of the binary tree int key; // left and right variables that are of Node type will be used to store the left and right child nodes of the parent of the binary tree Node left, right; // a parameterized constructor is created to create and add data to the node at the same time. public Node(int item) { key = item; left = right = null; } } // end of node class definition // A public class named BinaryTree is created having two constructors and methods to print the binary tree level-wise. class BinaryTree{ // A static variable named root_node is created that will represent the node of the binary tree static Node root_node; // A parametrized constructor of the BinaryTree class is written having the key as a parameter BinaryTree(int key) { // here we are constructing a new node and assigning it to the root node root_node = new Node(key); } BinaryTree() { root_node = null; } // a public static function named print tree is created to print all the nodes in the tree level-wise starting from the root node public static void printTree() { int h = height(root_node); int i; for (i=1; i<=h; i++){ printcurrentlevel(root_node, i); system.out.println(); } a public static function named height is created to fund the of binary tree starting from root node deepest leaf that present in passed as parameter called recursively until returned null find int height(node root){ then will be zero if (root="=" null) return 0; else { * compute each subtree lheight="height(root.left);" rheight="height(root.right);" use larger one both sub trees calcualted and which higher used. (lheight> rheight) return(lheight+1); else return(rheight+1); } } // a Public static function named printCurrentLevel is created to print al the nodes that are present in that level // this function is called repeatedly for each level of the binary tree to print all the nodes in that particular level public static void printCurrentLevel (Node root ,int level) { if (root == null) return; if (level == 1) System.out.print(root.key + &apos; &apos;); else if (level &gt; 1) { printCurrentLevel(root.left, level-1); printCurrentLevel(root.right, level-1); } } //the main function is created to create an object of the BinaryTree class and call the printTree method to level-wise print the nodes of the binary tree and the height method to find the height of the binary tree public static void main(String[] args){ // first of all we have created an Object of the BinaryTree class that will represent the binary tree BinaryTree tree = new BinaryTree(); // now a new node with the value as 150 is added as the root node to the Binary Tree tree.root_node = new Node(150); // now a new node with the value 250 is added as a left child to the root node tree.root_node.left = new Node(250); // now a new node with the value 270 is added as a right child to the root node tree.root_node.right = new Node(270); // now a new node with the value 320 is added as a left child to the left node of the previous level node tree.root_node.left.left = new Node(320); // now a new node with the value 350 is added as a right child to the right node of the previous level node tree.root_node.left.right = new Node(350); /* 150 /  250 270 /  /  320 350 null null */ System.out.println(&apos;Printing the nodes of tree level wise :&apos;); System.out.println(&apos;Level order traversal : &apos;); tree.printTree(); // height of the binary tree is calculated bypassing the root as parameter to the height() function. int h = tree.height(tree.root_node) System.out.println(&apos;The height of the Binary tree is : &apos; + h ); } } // end of the BinaryTree class </=h;>

산출: 위 코드의 출력은 다음과 같습니다.

 Printing the nodes of tree level wise: Level order traversal: (level 0) 150 (level 1) 250 270 (level 2) 320 350 The height of the Binary tree is: 2 

재귀적인 방식으로 우리는 키() 이진 트리의 높이를 찾기 위해 반복적으로 함수를 사용합니다. 이진 트리의 루트 노드는 height() 함수에 매개변수로 전달됩니다. height() 함수는 루트 노드의 두 하위 트리의 높이를 계산하고 두 높이 중 어느 쪽이 더 높은지를 이진 트리의 높이로 간주합니다.

비재귀적 방식

이제 이진 트리의 높이를 찾는 비재귀적 방법을 살펴보겠습니다.

루프 유형에 대한 Java

암호:

 // A C++ program to create and to find the height of a binary tree by non recursive way // iostream header file is included to use the cin and cout objects of the istream and ostream classes respectively #include #include using namespace std; // A struct named Node is created representing a single node of a binary tree struct Node { // The struct Node has three variables named key and left and right of int type and Node type respectively. // the key variable holds the actual value that is assigned to that node of the binary tree int key; // left and right variables that are of Node type will be used to store the left and right child nodes of the parent of the binary tree struct Node* left, *right; }; // A Function named newNode is created to add a new node to the binary tree, the newNode function has one parameter of integer type named key that will represent the value that particular new node will be storing Node* newNode(int key) { Node* temp = new Node; temp-&gt;key = key; temp-&gt;left = temp-&gt;right = NULL; return (temp); } // A function named height is created to find the height of the binary tree with non recursive way // The parameter to the height function is the root node of the binary tree that will be present at level zero // In the height function the nodes of the binary tree are added into the Queue data structure and the depth variable is incremented until // the NULL node is encountered while traversing the nodes of the binary tree stored in the Queue data structure. int height(struct Node* root){ //Initialising a variable to count the //height of tree int depth = 0; queueq; //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-&gt;left){ q.push(temp-&gt;left); } if(temp-&gt;right){ q.push(temp-&gt;right); } } //If queue still have elements left, //push NULL again to the queue. else if(!q.empty()){ q.push(NULL); } } return depth; } // Start of the main function int main() { // first of all we have created an Object of the struct Node that will represent the binary tree // the value of the root node is 10 Node *root = newNode(10); // now a new node with the value 20 is added as a left child to the root node root-&gt;left = newNode(20); // now a new node with the value 30 is added as a right child to the root node root-&gt;right = newNode(30); // now a new node with the value 40 is added as a left child to the left node of the previous level node root-&gt;left-&gt;left = newNode(40); // now a new node with the value 50 is added as a right child to the left node of the previous level node root-&gt;left-&gt;right = newNode(50); /* 10 /  20 30 /  /  40 50 null null */ cout&lt;<'the height(depth) of tree is: '<<height(root); cout<<endl; } end the main function < pre> <p> <strong>Output:</strong> </p> <pre> The Height(Depth) of the tree is: 2 </pre> <p>In this approach, we have used a non recursive way to find the depth of the binary tree. To find the height of the binary tree, we have written a function named height that will require a parameter of Node type (that means the root of the binary tree whose height needs to be calculated). The root of the binary tree is present at level zero, which means the height or depth of the root is zero.</p> <p>In the non recursive approach, we use the Queue Data Structure to find the depth of the binary tree. The nodes of the binary tree for which we want to find the depth are added to the Queue data structure with the help of an enqueue operation to which the node of the binary tree is passed as a parameter to this function.</p> <p>Once all the nodes are added to the queue, the nodes added in the queue are removed by calling the dequeue function that will keep on removing one element from the queue until the null node of the binary tree is encountered. Each time a node of the binary tree from the queue is removed, the depth variable representing the depth of the binary tree is incremented by one. And in the end, the value of the depth variable will represent the final depth of the binary tree.</p> <hr></'the>

이 접근 방식에서는 이진 트리의 깊이를 찾기 위해 비재귀적인 방법을 사용했습니다. 이진 트리의 높이를 찾기 위해 우리는 노드 유형(높이를 계산해야 하는 이진 트리의 루트를 의미)의 매개변수가 필요한 height라는 함수를 작성했습니다. 이진 트리의 루트는 레벨 0에 존재합니다. 이는 루트의 높이나 깊이가 0임을 의미합니다.

비재귀적 접근 방식에서는 대기열 데이터 구조를 사용하여 이진 트리의 깊이를 찾습니다. 깊이를 찾고자 하는 이진 트리의 노드는 이진 트리의 노드가 이 함수에 매개변수로 전달되는 인큐 작업을 통해 큐 데이터 구조에 추가됩니다.

모든 노드가 큐에 추가되면 큐에 추가된 노드는 이진 트리의 널 노드를 만날 때까지 큐에서 한 요소를 계속 제거하는 dequeue 함수를 호출하여 제거됩니다. 큐에서 이진 트리의 노드가 제거될 때마다 이진 트리의 깊이를 나타내는 깊이 변수가 1씩 증가합니다. 그리고 결국 깊이 변수의 값은 이진 트리의 최종 깊이를 나타냅니다.