输入两棵二叉树A,B,判断B是不是A的子结构(c++实现)

#include <iostream>
#include <cstdio>
#include <stdio.h>
#include <string>
#include <queue>
#include <stack>
using namespace std;

class Node{
public :
    char data;
    struct Node *lchild,*rchild;
};

class BiTree{
public:
    Node * root;//头结点
    int height=0;//树的高度
    BiTree() {root=NULL;}
    //层序创建二叉树
    void create_level(string &s)
    {
       int p=0;
       root=new Node();

       Node *t,*i,*j;
       queue<Node*> qTree;//定义一个队列,存储节点
       while(true)
       {
           if(p==s.size())break;
           if(p==0)//当头结点未创建
           {
               t=new Node();
               t->data=s[p];
               qTree.push(t);//头结点进队
               root=t;
               p++;
           }
           else
           {
               t=qTree.front();//该节点出队
               if(p==s.size())break;//树的构建完毕
               if(s[p]==‘#‘)//不存在左节点
               {
                  t->lchild=NULL;
                  p++;
               }
               else//存在左节点
               {
                   i=new Node();
                   i->data=s[p];
                   t->lchild=i;//左节点进队
                   qTree.push(i);
                   p++;
               }

               if(p==s.size())break;
               if(s[p]==‘#‘)//不存在右节点
               {
                  t->rchild=NULL;
                  p++;
               }
               else//存在右节点
               {
                   j=new Node();
                   j->data=s[p];
                   t->rchild=j;
                   qTree.push(j);
                   p++;
               }

               qTree.pop();//节点左右节点已创建,该节点出队
           }
       }

    }
};

class Solution
{
    bool isSubtree(Node* pRootA,Node* pRootB)
    {
        /*以下if语句不能调换,如果调换返回结果都为false
         *比如: A树:123 B树:123
         *     在遍历两树的节点2时,递归进入下一次,两树的节点2的左节点都为NULL,进入递归
         *     此时pRootA=NULL、pRootB=NULL,如果pRootA==NULL放在前面,返回false
        */
        if(pRootB==NULL) return true;
        if(pRootA==NULL) return false;
        if(pRootA->data==pRootB->data)
        {
            //如果树A树B节点值相等,继续递归遍历他们的左右节点是否相等
            return isSubtree(pRootA->lchild,pRootB->lchild)&& isSubtree(pRootA->rchild,pRootB->rchild);
        }
        else return false;
    }
public:
    bool HasSubtree(Node* pRootA,Node* pRootB)
    {
        if(pRootA==NULL||pRootB==NULL)return false;
        //从树A的该节点开始遍历看是否与B节点的根值是否相同 || 比较树A的该节点的左节点与树B的根节点 || 比较树A的该节点的右节点与树B的根节点
        return isSubtree(pRootA,pRootB)||HasSubtree(pRootA->lchild,pRootB)||HasSubtree(pRootA->rchild,pRootB);
    }
};

int main()
{
    BiTree a,b;
    string s1,s2;
    s1="88792####47";
    a.create_level(s1);
    s2="892";
    b.create_level(s2);
    Solution s;
    bool bo=s.HasSubtree(a.root,b.root);
    cout<<bo<<endl;

    return 0;
}

原文地址:https://www.cnblogs.com/ybf-yyj/p/9221169.html

时间: 2024-10-16 23:06:26

输入两棵二叉树A,B,判断B是不是A的子结构(c++实现)的相关文章

28、输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)

题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 思路:  1.当Tree1和Tree2都不为零的时候,才进行比较.否则直接返回false  2. 2.1如果找到了对应Tree2的根节点的点, 以这个根节点为为起点判断是否包含Tree2 2.2 如果找不到,那么就再去root的左孩子当作起点,去判断时候包含Tree22.3 如果还找不到,那么就再去root的右孩子当作起点,去判断时候包含Tree2 1 public class Solution

比较两棵二叉树--(比较两棵二叉树是否相同/判断一棵二叉树是否是另一棵二叉树的子树)

一,问题介绍 本文章讨论两个问题: ①如何判断两棵二叉树的结构是一样的.对应的每个结点都有着相同的值.--即判断两棵二叉树是一样的 ②给定两棵二叉树,如何判断一棵二叉树是另一棵二叉树的子结构 ③给定两棵二叉树,如何判断一棵二叉树是另一棵二叉树的子树 注意,子结点与子树有那么一点点不同. 上面的二叉树B 是二叉树A 的子结构,但是不能说是二叉树A的子树.但是二叉树C 是 二叉树A的子树. 二,问题分析 1,如何判断两棵二叉树的结构是一样的.且对应的每个结点都有着相同的值. 对于①如何判断两棵二叉树

输入两棵二叉树A和B,判断B是不是A的子结构。

public class Solution { private class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } //HasSubtree主要是判断树root1中是否含有root2节点 public boolean HasSubtree(TreeNode root1,TreeNode root2) { i

输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)

public class Solution { public boolean HasSubtree(TreeNode root1,TreeNode root2) { if(root2==null){ return false; } if(root1==null){ return false; } return isSubtree(root1,root2)||isSubtree(root1.left,root2)||isSubtree(root1.right,root2); } public st

剑指offer38:输入一棵二叉树,求该树的深度

1 题目描述 输入一棵二叉树,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度. 2 思路和方法 深度优先搜索,每次得到左右子树当前最大路径,选择其中较大者并回溯.int len = left>right?left+1:right+1;    // 当前最大路径 3 C++ 核心代码 1 /* 2 struct TreeNode { 3 int val; 4 struct TreeNode *left; 5 struct TreeNode *

020给定两个二叉树T1,T2判断T1是否是T2的子树(keep it up)

给定两个二叉树T1,T2判断T1是否是T2的子树 首先在T2中查找T1的根节点,如果找不到, 则T1不是T2的子树,如果能找到,我们可以 遍历T1,检查T1的每个结点是否对应的存在T2 中. 代码: struct TreeNode { int data; TreeNode* leftChild; TreeNode* rightChild; }; bool isExited(const TreeNode* vRoot1, const TreeNode *vRoot2, TreeNode* vRes

C++算法之 求二叉树中叶子节点的个数 与 判断两棵二叉树是否结构相同

//叶子节点的个数 /* (1)如果二叉树为空,返回0 (2)如果二叉树不为空且左右子树为空,返回1 (3)如果二叉树不为空,且左右子树不同时为空,返回左子树中叶子节点个数加上右子树中叶子节点个数 */ int GetLeafNodeNum(BTree* root) { if(root == NULL) return 0; if(root->m_pLeft == NULL && root->m_pRight == NULL) return 1; int LeafNumOfLef

判断两棵二叉树是否相等

算法思想:先序遍历,递归实现.先判断根节点是否相等,然后在判断左右子树是否相等.代码如下 1 //二叉树节点结构体 2 struct BinaryNode 3 { 4 int data; 5 BinaryNode * lc; 6 BinaryNode * rc; 7 }*BTree; 8 9 //判断二叉树是否相等的函数 10 11 bool isEqual(BTree T1,BTree T2) 12 { 13 if(T1 == NULL && T2 == NULL) 14 return

输入两个二叉树A与B,判断B是否是A的子结构

思路:第一步判断a的值是否和b的根结点相等不,不相等比较a的左子树和b进行比较,不同在判断a的右子树与b进行比较,重复第一步迭代.第二步,当找到a的子树和b的根结点相同时,比较该子树的左右结点 是否和b的左右结点相同. //是否包含 public static boolean hasSubTree(TreeNote root1,TreeNote root2){ boolean result=false; if(root1!=null&&root2!=null){ if(root1.getV