📌  相关文章
📜  检查是否存在具有给定序列的根到叶路径

📅  最后修改于: 2022-05-13 01:57:19.637000             🧑  作者: Mango

检查是否存在具有给定序列的根到叶路径

给定一棵二叉树和一个数组,任务是找出给定的数组序列是否作为给定树中的根到叶路径存在。

例子 :

Input : arr[] = {5, 2, 4, 8} for above tree
Output: "Path Exist"

Input :  arr[] = {5, 3, 4, 9} for above tree
Output: "Path does not Exist"

这个问题的一个简单解决方案是找到给定树中的所有根到叶路径,并为每个根到叶路径检查数组中的路径和给定序列是否相同。

这个问题的一个有效解决方案是遍历树一次,在遍历树时,我们必须检查从根到当前节点的路径是否与给定的根到叶路径序列相同。这是算法:

  • 预购方式开始遍历树。
  • 每当我们在树中向下移动时,我们也会在给定的根到叶路径序列中移动一个索引
  • 如果当前节点等于arr[index]这意味着直到这个级别的树路径是相同的。
  • 现在剩余的路径将在左子树右子树中。
  • 如果任何节点与arr[index]不匹配,这意味着当前路径与给定的根到叶路径序列不同,因此我们返回并在右子树中移动。
  • 现在,当我们位于叶节点并且它等于arr[index]并且在给定的根到叶路径序列中没有其他元素时,这意味着路径存在于给定树中。
    C++
    // C++ program to see if there is a root to leaf path
    // with given sequence.
    #include
    using namespace std;
      
    /* A binary tree node has data, pointer to left child
    and a pointer to right child */
    struct Node
    {
        int data;
        struct Node* left, *right;
    };
      
    /* utility that allocates a new node with the
    given data and NULL left and right pointers. */
    struct Node* newnode(int data)
    {
        struct Node* node = new Node;
        node->data = data;
        node->left = node->right = NULL;
        return (node);
    }
      
      
    // Util function
    bool existPathUtil(struct Node *root, int arr[], int n, int index)
    {
        // If root is NULL or reached end of the array
        if(root == NULL or index==n) 
                return false; 
      
        // If current node is leaf
        if (root->left == NULL && root->right == NULL)
        {
            if((root->data == arr[index]) && (index == n-1)) 
                return true; 
             
           return false;
        } 
      
        // If current node is equal to arr[index] this means
        // that till this level path has been matched and
        // remaining path can be either in left subtree or
        // right subtree.
        return ((index < n) && (root->data == arr[index]) &&
                    (existPathUtil(root->left, arr, n, index+1) ||
                    existPathUtil(root->right, arr, n, index+1) ));
    }
      
    // Function to check given sequence of root to leaf path exist
    // in tree or not.
    // index represents current element in sequence of rooth to
    // leaf path
    bool existPath(struct Node *root, int arr[], int n, int index)
    {
        if(!root)
            return (n==0);
              
        return existPathUtil(root, arr, n, 0);
    }
      
    // Driver function to run the case
    int main()
    {
        // arr[] --> sequence of root to leaf path
        int arr[] = {5, 8, 6, 7};
        int n = sizeof(arr)/sizeof(arr[0]);
        struct Node *root = newnode(5);
        root->left = newnode(3);
        root->right = newnode(8);
        root->left->left = newnode(2);
        root->left->right = newnode(4);
        root->left->left->left = newnode(1);
        root->right->left = newnode(6);
        root->right->left->right = newnode(7);
      
        existPath(root, arr, n, 0)? cout << "Path Exists" :
                                    cout << "Path does not Exist";
        return 0;
    }


    Java
    // Java program to see if there is a root to leaf path
    // with given sequence.
    import java.io.*;
      
    class Node
    {
        int data;
        Node left;
        Node right;
          
        Node(int data)
        {
            this.data = data;
            this.left = null;
            this.right = null;
        }
    }
      
      
    class GFG {
          
        // Util function
        static boolean existPathUtil(Node root, int arr[], 
                            int n, int index)
        {
            // If root is NULL or 
            // reached end of the array
            if(root == null || index==n) 
                    return false; 
           
            // If current node is leaf
            if (root.left == null && 
                            root.right == null)
            {
                if((root.data == arr[index]) && 
                                    (index == n-1)) 
                    return true; 
                  
               return false;
            } 
           
            // If current node is equal to arr[index] this means
            // that till this level path has been matched and
            // remaining path can be either in left subtree or
            // right subtree.
            return ((index < n) && (root.data == arr[index]) 
                &&  (existPathUtil(root.left, arr, n, index+1)
                || existPathUtil(root.right, arr, n, index+1) ));
        }
           
        // Function to check given sequence of root 
        // to leaf path exist in tree or not.
        // index : current element in sequence of root to
        // leaf path
        static boolean existPath(Node root, int arr[], 
                                        int n, int index)
        {
            if(root == null)
                return (n==0);
                   
            return existPathUtil(root, arr, n, 0);
        }
      
          
        public static void main (String[] args) {
              
        // arr[] : sequence of root to leaf path
        int arr[] = {5, 8, 6, 7};
        int n = arr.length;
        Node root = new Node(5);
        root.left = new Node(3);
        root.right = new Node(8);
        root.left.left = new Node(2);
        root.left.right = new Node(4);
        root.left.left.left = new Node(1);
        root.right.left = new Node(6);
        root.right.left.right = new Node(7);
       
        if(existPath(root, arr, n, 0))
            System.out.println("Path Exists");
        else
            System.out.println("Path does not Exist");
              
        }
    }


    Python3
    # Python program to see if
    # there is a root to leaf path
    # with given sequence
      
    # Class of Node
    class Node:
          
        # Constructor to create a 
        # node in Binary Tree
        def __init__(self, val):
            self.val = val
            self.left = None
            self.right = None
       
    # Util function   
    def existPathUtil(root, arr, n, index):
          
        # If root is NULL or reached 
        # end of the array
        if not root or index == n:
            return False
          
        # If current node is leaf
        if not root.left and not root.right:
            if root.val == arr[index] and index == n-1:
                return True
            return False
          
        # If current node is equal to arr[index] this means
        # that till this level path has been matched and
        # remaining path can be either in left subtree or
        # right subtree.
        return ((index < n) and (root.val == arr[index]) and \
                (existPathUtil(root.left, arr, n, index+1) or \
                existPathUtil(root.right, arr, n, index+1)))
      
    # Function to check given sequence of root to leaf path exist
    # in tree or not.
    # index represents current element in sequence of rooth to
    # leaf path         
    def existPath(root, arr, n, index):
        if not root:
            return (n == 0)
              
        return existPathUtil(root, arr, n, 0)
      
    # Driver Code
    if __name__ == "__main__":
        arr = [5, 8, 6, 7]
        n = len(arr)
        root = Node(5)
        root.left = Node(3)
        root.right = Node(8)
        root.left.left = Node(2)
        root.left.right = Node(4)
        root.left.left.left = Node(1)
        root.right.left = Node(6)
        root.right.left.right = Node(7)
          
        if existPath(root, arr, n, 0):
            print("Path Exists")
        else:
            print("Path does not Exist")


    C#
    // C# program to see if there
    // is a root to leaf path 
    // with given sequence. 
    using System;
      
    public class CheckForPath 
    {
      
        // function to check given sequence
        // of root to leaf path exist 
        // in tree or not. 
        // index represents current element
        // in sequence of rooth to 
        // leaf path 
        public static bool existPath(Node root,
                            int []arr, int index)
        {
            // If root is NULL, then there
            // must not be any element 
            // in array. 
            if(root == null)
            {
                return arr.Length == 0;
            }
      
            // If this node is a leaf and matches with last entry 
            // of array. 
            if((root.left == null && root.right == null) && 
                                    (root.data == arr[index] &&
                                    root.data == arr[arr.Length - 1]))
            {
                return true;
            }
      
            // If current node is equal to arr[index] this means 
            // that till this level path has been matched and 
            // remaining path can be either in left subtree or 
            // right subtree. 
            return (index < arr.Length && (root.data == arr[index] && 
                           (existPath(root.left,arr,index + 1) || 
                            existPath(root.right, arr, index + 1))));
        }
          
        // Driver code
        public static void Main() 
        {
            // arr[] is sequence of root to leaf path 
            int []arr = {5, 8, 6, 7}; 
            Node root=new Node(5);
            root.left=new Node(3);
            root.right=new Node(8);
            root.left.left = new Node(2); 
            root.left.right = new Node(4); 
            root.left.left.left = new Node(1); 
            root.right.left = new Node(6); 
            root.right.left.right = new Node(7); 
      
            if(existPath(root, arr, 0))
            {
                Console.Write("Path Exists");
            }
            else
            {
                Console.Write("Path does not Exist");
            }
        } 
    }
      
    /* A binary tree node has data, 
    pointer to left child and a
    pointer to right child */
    public class Node 
    { 
        public int data; 
        public Node left, right; 
        public Node(int data)
        {
            this.data = data;
            left = right = null;
        }
    };
      
    // This code is contributed Rajput-Ji



    输出:
    Path Exists
    

    时间复杂度: O(n)