当前位置: 首页 > 知识库问答 >
问题:

检查是否子树?,提前Thanx

东门秦迟
2023-03-14

给定两个头引用为T和S的二叉树,最多有N个节点。任务是检查S是否作为T中的子树存在。树T1的子树是由T1中的一个节点和T1中的所有它的后代组成的树T2。

为什么我的方法失败了?

我的algo是:-找到T的inorder和preorder遍历,将它们存储在两个列表中。查找%S的inorder和preorder遍历,将它们存储在两个列表中。如果T的inorder和preorder列表出现在S的inorder和preorder列表中,则返回true,否则为false。


import java.util.LinkedList; 
import java.util.Queue; 
import java.io.*;
import java.util.*;

class Node{
    int data;
    Node left;
    Node right;
    Node(int data){
        this.data = data;
        left=null;
        right=null;
    }
}

class GfG {
    
    static Node buildTree(String str){
        
        if(str.length()==0 || str.charAt(0)=='N'){
            return null;
        }
        
        String ip[] = str.split(" ");
        // Create the root of the tree
        Node root = new Node(Integer.parseInt(ip[0]));
        // Push the root to the queue
        
        Queue<Node> queue = new LinkedList<>(); 
        
        queue.add(root);
        // Starting from the second element
        
        int i = 1;
        while(queue.size()>0 && i < ip.length) {
                
            // Get and remove the front of the queue
            Node currNode = queue.peek();
            queue.remove();
                
            // Get the current node's value from the string
            String currVal = ip[i];
                
            // If the left child is not null
            if(!currVal.equals("N")) {
                    
                // Create the left child for the current node
                currNode.left = new Node(Integer.parseInt(currVal));
                // Push it to the queue
                queue.add(currNode.left);
            }
                
            // For the right child
            i++;
            if(i >= ip.length)
                break;
                
            currVal = ip[i];
                
            // If the right child is not null
            if(!currVal.equals("N")) {
                    
                // Create the right child for the current node
                currNode.right = new Node(Integer.parseInt(currVal));
                    
                // Push it to the queue
                queue.add(currNode.right);
            }
            i++;
        }
        
        return root;
    }
    static void printInorder(Node root){
        if(root == null)
            return;
            
        printInorder(root.left);
        System.out.print(root.data+" ");
        
        printInorder(root.right);
    }
    
    public static void main (String[] args) throws IOException {
            BufferedReader br= new BufferedReader(new InputStreamReader(System.in));
            
            int t=Integer.parseInt(br.readLine());
            while(t-- > 0){
                String tt= br.readLine();
                Node rootT = buildTree(tt);
                
                String s= br.readLine();
                Node rootS = buildTree(s);
               // printInorder(root);
                
                Solution tr=new Solution();
                boolean st=tr.isSubtree(rootT, rootS);
                if(st==true){
                    System.out.println("1");
                }else{
                    System.out.println("0");
                }
            }
    }
}// } Driver Code Ends



class Solution {
    // algo implementation is started from here.
public static void preorder(Node root , ArrayList<Integer>al )
{
    if(root!=null)
    {
    al.add(root.data);
    preorder(root.left, al);
    preorder(root.right, al);
    }
}

public static void inorder(Node root, ArrayList<Integer>al)
{
    
  if(root!=null)
    {
    
    inorder(root.left, al);
    al.add(root.data);
    inorder(root.right, al);  
    }
    
}

    public static boolean isSubtree(Node t, Node s) 
    {
        ArrayList<Integer> alt1 = new ArrayList<>();
        ArrayList<Integer>alt2 = new ArrayList<>();
        
        ArrayList<Integer> als1 = new ArrayList<>();
        ArrayList<Integer>als2 = new ArrayList<>();
  
    preorder(t,alt1);
    inorder(t,alt2);
    
    preorder(s,als1);
    inorder(s,als2);
    
if(als1.containsAll(alt1) && als2.contains(alt2))
return true;
 
    
    
    return false;
    
    
    
         
    }
}
~~~

共有1个答案

贲俊才
2023-03-14

您是否正确,您正在检查%S的arraylist是否具有%T的arraylist中存在的所有值。只需将此部分als1.CONTAINSALL(alt1)&&als2.CONTAINS(alt2)更改为,如果(alt1.CONTAINSALL(als1)&&alt2.CONTAINS(als2))返回true;

 类似资料:
  • QSTN:当它是叶节点时,为什么需要初始化ls=0或rs=0。考虑链接中给出的树,如果我们到达节点4,如果(node==NULL isLeaf(node))返回1;上面的代码将1(true)返回到调用它的函数,即节点10,类似地,右侧将true返回到节点10,因此我们现在可以进入下面的循环,因为如果(isSumTree(node->left)&&isSumTree(node->left)&&isS

  • 我想写一个方法来确定一棵树是否至少有一对相同的子树,这些子树的值和结构都必须相同。 假设给你一棵树,如下所示: 这将返回,因为我们有一对根为的相同树。 我的想法是遍历每个节点,构建一个映射到

  • 如何让prolog中的谓词返回值? 我需要找到一个树的节点,并检查它是否是一个最小堆。我猜是这样的:- 到目前为止我的代码是这个 输入的类型是- 输出应该为真。

  • 我实现了下面的C代码,以检查二叉树是否平衡,即左右子树的高度相差最多1。但是,我不确定它是否有效,或者以错误的方式重复检查子树。有人能引导我吗?

  • 我知道如何检查给定的树是否是二叉树。但问题是,如果树包含重复的值,该怎么办。 如何检查可能包含重复值的树是否是二叉查找树重复值必须位于树/子树的右侧。

  • 我正试图解决这个问题,但我遇到了一些麻烦: 在二进制搜索树(BST)中: 节点左子树中每个节点的数据值小于该节点的数据值。 节点右侧子树中每个节点的数据值大于该节点的数据值。 如您所见,节点(4)位于节点(3)的左侧子树中,尽管4大于3,因此方法应该返回。但是,我的代码返回。 我怎么能控制这个案子?如何检查左/右子树中的所有值都低于/大于根(不仅是直接子树)?