이진 트리가 주어지면 연속적인 값을 갖는 노드로 구성된 가장 긴 경로의 길이를 오름차순으로 찾습니다. 모든 노드는 길이가 1인 경로로 간주됩니다.
예:
10 / / 11 9 / / / / 13 12 13 8 Maximum Consecutive Path Length is 3 (10 11 12) Note : 10 9 8 is NOT considered since the nodes should be in increasing order. 5 / / 8 11 / / 9 10 / / / / 6 15 Maximum Consecutive Path Length is 2 (8 9).
이진 트리의 모든 노드는 상위 노드 중 하나에서 시작하는 경로의 일부가 되거나 이 노드 자체에서 새 경로가 시작될 수 있습니다. 핵심은 왼쪽 및 오른쪽 하위 트리의 경로 길이를 재귀적으로 찾은 다음 최대값을 반환하는 것입니다. 아래에서 설명하는 트리를 순회하는 동안 일부 경우를 고려해야 합니다.
- 이전 : 상위 노드의 값을 저장합니다. 루트에서 시작하는 경로의 길이가 최소 1이 될 수 있도록 루트 노드 값보다 하나 작은 값으로 prev를 초기화합니다.
- 오직 : 현재 방문한 노드의 상위에서 끝나는 경로 길이를 저장합니다.
사례 1 : 현재 노드의 값은 prev +1입니다.
이 경우 경로 길이를 1만큼 늘린 다음 왼쪽 및 오른쪽 하위 트리에 대한 경로 길이를 재귀적으로 찾은 다음 두 길이 사이의 최대값을 반환합니다.
사례 2 : 현재 노드의 값은 prev+1이 아닙니다.
새 경로는 이 노드에서 시작될 수 있으므로 왼쪽 및 오른쪽 하위 트리의 경로 길이를 재귀적으로 찾습니다. 현재 노드의 상위 노드에서 끝나는 경로는 이 노드에서 시작하는 경로보다 클 수 있습니다. 따라서 이 노드에서 시작하고 이전 노드에서 끝나는 경로의 최대값을 취합니다.
아래는 위의 아이디어를 구현한 것입니다.
C++// C++ Program to find Maximum Consecutive // Path Length in a Binary Tree #include using namespace std; // To represent a node of a Binary Tree struct Node { Node *left *right; int val; }; // Create a new Node and return its address Node *newNode(int val) { Node *temp = new Node(); temp->val = val; temp->left = temp->right = NULL; return temp; } // Returns the maximum consecutive Path Length int maxPathLenUtil(Node *root int prev_val int prev_len) { if (!root) return prev_len; // Get the value of Current Node // The value of the current node will be // prev Node for its left and right children int cur_val = root->val; // If current node has to be a part of the // consecutive path then it should be 1 greater // than the value of the previous node if (cur_val == prev_val+1) { // a) Find the length of the Left Path // b) Find the length of the Right Path // Return the maximum of Left path and Right path return max(maxPathLenUtil(root->left cur_val prev_len+1) maxPathLenUtil(root->right cur_val prev_len+1)); } // Find length of the maximum path under subtree rooted with this // node (The path may or may not include this node) int newPathLen = max(maxPathLenUtil(root->left cur_val 1) maxPathLenUtil(root->right cur_val 1)); // Take the maximum previous path and path under subtree rooted // with this node. return max(prev_len newPathLen); } // A wrapper over maxPathLenUtil(). int maxConsecutivePathLength(Node *root) { // Return 0 if root is NULL if (root == NULL) return 0; // Else compute Maximum Consecutive Increasing Path // Length using maxPathLenUtil. return maxPathLenUtil(root root->val-1 0); } //Driver program to test above function int main() { Node *root = newNode(10); root->left = newNode(11); root->right = newNode(9); root->left->left = newNode(13); root->left->right = newNode(12); root->right->left = newNode(13); root->right->right = newNode(8); cout << 'Maximum Consecutive Increasing Path Length is ' << maxConsecutivePathLength(root); return 0; }
Java // Java Program to find Maximum Consecutive // Path Length in a Binary Tree import java.util.*; class GfG { // To represent a node of a Binary Tree static class Node { Node left right; int val; } // Create a new Node and return its address static Node newNode(int val) { Node temp = new Node(); temp.val = val; temp.left = null; temp.right = null; return temp; } // Returns the maximum consecutive Path Length static int maxPathLenUtil(Node root int prev_val int prev_len) { if (root == null) return prev_len; // Get the value of Current Node // The value of the current node will be // prev Node for its left and right children int cur_val = root.val; // If current node has to be a part of the // consecutive path then it should be 1 greater // than the value of the previous node if (cur_val == prev_val+1) { // a) Find the length of the Left Path // b) Find the length of the Right Path // Return the maximum of Left path and Right path return Math.max(maxPathLenUtil(root.left cur_val prev_len+1) maxPathLenUtil(root.right cur_val prev_len+1)); } // Find length of the maximum path under subtree rooted with this // node (The path may or may not include this node) int newPathLen = Math.max(maxPathLenUtil(root.left cur_val 1) maxPathLenUtil(root.right cur_val 1)); // Take the maximum previous path and path under subtree rooted // with this node. return Math.max(prev_len newPathLen); } // A wrapper over maxPathLenUtil(). static int maxConsecutivePathLength(Node root) { // Return 0 if root is NULL if (root == null) return 0; // Else compute Maximum Consecutive Increasing Path // Length using maxPathLenUtil. return maxPathLenUtil(root root.val-1 0); } //Driver program to test above function public static void main(String[] args) { Node root = newNode(10); root.left = newNode(11); root.right = newNode(9); root.left.left = newNode(13); root.left.right = newNode(12); root.right.left = newNode(13); root.right.right = newNode(8); System.out.println('Maximum Consecutive Increasing Path Length is '+maxConsecutivePathLength(root)); } }
Python3 # Python program to find Maximum consecutive # path length in binary tree # A binary tree node class Node: # Constructor to create a new node def __init__(self val): self.val = val self.left = None self.right = None # Returns the maximum consecutive path length def maxPathLenUtil(root prev_val prev_len): if root is None: return prev_len # Get the value of current node # The value of the current node will be # prev node for its left and right children curr_val = root.val # If current node has to be a part of the # consecutive path then it should be 1 greater # than the value of the previous node if curr_val == prev_val +1 : # a) Find the length of the left path # b) Find the length of the right path # Return the maximum of left path and right path return max(maxPathLenUtil(root.left curr_val prev_len+1) maxPathLenUtil(root.right curr_val prev_len+1)) # Find the length of the maximum path under subtree # rooted with this node newPathLen = max(maxPathLenUtil(root.left curr_val 1) maxPathLenUtil(root.right curr_val 1)) # Take the maximum previous path and path under subtree # rooted with this node return max(prev_len newPathLen) # A Wrapper over maxPathLenUtil() def maxConsecutivePathLength(root): # Return 0 if root is None if root is None: return 0 # Else compute maximum consecutive increasing path # length using maxPathLenUtil return maxPathLenUtil(root root.val -1 0) # Driver program to test above function root = Node(10) root.left = Node(11) root.right = Node(9) root.left.left = Node(13) root.left.right = Node(12) root.right.left = Node(13) root.right.right = Node(8) print ('Maximum Consecutive Increasing Path Length is') print (maxConsecutivePathLength(root)) # This code is contributed by Nikhil Kumar Singh(nickzuck_007)
C# // C# Program to find Maximum Consecutive // Path Length in a Binary Tree using System; class GfG { // To represent a node of a Binary Tree class Node { public Node left right; public int val; } // Create a new Node and return its address static Node newNode(int val) { Node temp = new Node(); temp.val = val; temp.left = null; temp.right = null; return temp; } // Returns the maximum consecutive Path Length static int maxPathLenUtil(Node root int prev_val int prev_len) { if (root == null) return prev_len; // Get the value of Current Node // The value of the current node will be // prev Node for its left and right children int cur_val = root.val; // If current node has to be a part of the // consecutive path then it should be 1 greater // than the value of the previous node if (cur_val == prev_val+1) { // a) Find the length of the Left Path // b) Find the length of the Right Path // Return the maximum of Left path and Right path return Math.Max(maxPathLenUtil(root.left cur_val prev_len+1) maxPathLenUtil(root.right cur_val prev_len+1)); } // Find length of the maximum path under subtree rooted with this // node (The path may or may not include this node) int newPathLen = Math.Max(maxPathLenUtil(root.left cur_val 1) maxPathLenUtil(root.right cur_val 1)); // Take the maximum previous path and path under subtree rooted // with this node. return Math.Max(prev_len newPathLen); } // A wrapper over maxPathLenUtil(). static int maxConsecutivePathLength(Node root) { // Return 0 if root is NULL if (root == null) return 0; // Else compute Maximum Consecutive Increasing Path // Length using maxPathLenUtil. return maxPathLenUtil(root root.val - 1 0); } // Driver code public static void Main(String[] args) { Node root = newNode(10); root.left = newNode(11); root.right = newNode(9); root.left.left = newNode(13); root.left.right = newNode(12); root.right.left = newNode(13); root.right.right = newNode(8); Console.WriteLine('Maximum Consecutive' + ' Increasing Path Length is '+ maxConsecutivePathLength(root)); } } // This code has been contributed by 29AjayKumar
JavaScript <script> // Javascript Program to find Maximum Consecutive // Path Length in a Binary Tree // To represent a node of a Binary Tree class Node { constructor(val) { this.val = val; this.left = this.right = null; } } // Returns the maximum consecutive Path Length function maxPathLenUtil(rootprev_valprev_len) { if (root == null) return prev_len; // Get the value of Current Node // The value of the current node will be // prev Node for its left and right children let cur_val = root.val; // If current node has to be a part of the // consecutive path then it should be 1 greater // than the value of the previous node if (cur_val == prev_val+1) { // a) Find the length of the Left Path // b) Find the length of the Right Path // Return the maximum of Left path and Right path return Math.max(maxPathLenUtil(root.left cur_val prev_len+1) maxPathLenUtil(root.right cur_val prev_len+1)); } // Find length of the maximum path under subtree rooted with this // node (The path may or may not include this node) let newPathLen = Math.max(maxPathLenUtil(root.left cur_val 1) maxPathLenUtil(root.right cur_val 1)); // Take the maximum previous path and path under subtree rooted // with this node. return Math.max(prev_len newPathLen); } // A wrapper over maxPathLenUtil(). function maxConsecutivePathLength(root) { // Return 0 if root is NULL if (root == null) return 0; // Else compute Maximum Consecutive Increasing Path // Length using maxPathLenUtil. return maxPathLenUtil(root root.val-1 0); } // Driver program to test above function let root = new Node(10); root.left = new Node(11); root.right = new Node(9); root.left.left = new Node(13); root.left.right = new Node(12); root.right.left = new Node(13); root.right.right = new Node(8); document.write('Maximum Consecutive Increasing Path Length is '+ maxConsecutivePathLength(root)+'
'); // This code is contributed by rag2127 </script>
산출
Maximum Consecutive Increasing Path Length is 3
시간 복잡도: O(n^2) 여기서 n은 주어진 이진 트리의 노드 수입니다.
보조 공간: O(log(n))