logo

Maximális egymást követő növekvő útvonalhossz a bináris fában

Adott egy bináris fa, keresse meg a leghosszabb út hosszát, amely növekvő sorrendben egymást követő értékekkel rendelkező csomópontokat tartalmaz. Minden csomópontot 1 hosszúságú útvonalnak tekintünk. 

Példák: 



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

A bináris fa minden csomópontja vagy részévé válhat annak az útvonalnak, amely az egyik szülőcsomópontjából indul ki, vagy egy új útvonal indulhat magától ettől a csomóponttól. A kulcs az, hogy rekurzív módon megkeressük a bal és a jobb oldali alfa útvonalhosszát, majd visszaadjuk a maximumot. Néhány esetet figyelembe kell venni a fán való áthaladás során, amelyeket alább tárgyalunk.

  • előz : tárolja a szülőcsomópont értékét. Inicializálja az előzőt a gyökércsomópont értékénél eggyel kisebb értékkel, hogy a gyökérből induló útvonal legalább 1 hosszúságú legyen. 
  • csak : Tárolja az útvonal hosszát, amely az aktuálisan meglátogatott csomópont szülőjénél végződik.

1. eset : Az aktuális csomópont értéke előző +1 
Ebben az esetben növelje az útvonal hosszát 1-gyel, majd keresse meg rekurzív módon a bal és a jobb oldali alfa útvonalhosszát, majd adja vissza a két hossz közötti maximumot.

2. eset : Az aktuális csomópont értéke NEM előző+1 
Ebből a csomópontból egy új útvonal indulhat, így rekurzív módon keresse meg a bal és a jobb oldali alfa útvonalhosszát. Az útvonal, amely az aktuális csomópont szülőcsomópontjánál végződik, nagyobb lehet, mint az ettől a csomóponttól induló útvonal. Tehát vegye ki az ebből a csomópontból induló és az előző csomópontnál végződő útvonal maximumát.



Alább látható a fenti ötlet megvalósítása.

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>

Kimenet
Maximum Consecutive Increasing Path Length is 3

Időbonyolultság: O(n^2) ahol n az adott bináris fa csomópontjainak száma.
Segédtér: O(log(n))