判断二叉树B是否是二叉树A的一部分

public class 判断B树是否是A树的子树
{
    // 递归 判断其是否为子树
    public boolean HasSubtree(TreeNode root1, TreeNode root2)
    {
        // 若root2为null则直接返回false
        boolean res = false;
        if (root1 != null && root2 != null)
        {
            // 判断第一个相同的结点 然后递归进行比较
            if (root1.val == root2.val)
            {
                res = isTree1HasTree2(root1, root2);
            }
            // 否则进行root1.left 为新的root1
            if (!res)
            {
                res = HasSubtree(root1.left, root2);
            }
            // 否则进行root1.left 为新的root1
            if (!res)
            {
                res = HasSubtree(root1.right, root2);
            }
        }
        return res;
    }

private boolean isTree1HasTree2(TreeNode root1, TreeNode root2)
    {
        // root2还有结点而root1没有结点了
        if (root1 == null && root2 != null)
        {
            return false;
        }
        // root2最后都没有结点
        if (root2 == null)
        {
            return true;
        }
        // 值不等
        if (root1.val != root2.val)
        {
            return false;
        }
        return isTree1HasTree2(root1.left, root2.left)
                && isTree1HasTree2(root1.right, root2.right);
    }

}

时间: 2024-10-10 05:24:19

判断二叉树B是否是二叉树A的一部分的相关文章

判断一个数列是不是搜索二叉树后续遍历输出的结果

剑平面阿里被问到这个,刚开始画了下看有什么性质,乱蒙了几个都被推翻了,初始感觉就是要O(n)的,因为印象中BST的构树都可以O(nlogn)搞定.然后剑平说最后一个数肯定是根节点,一下反应过来了,就是二分出间隔点然后两边递归判断,不过这好像还是构树的思路,可以把整棵树构造出来.然后剑平说不是二分,直接遍历.不科学啊,明显的二分,然后去网上搜一下,都是遍历的,O(n^2)的吧.想了想,二分是当做合法的情况来构树的,不合法怎么判断?构造出搜索二叉树后中序遍历一下不就行了么,妥妥的O(nlogn)吧.

判断任一二叉树,是否为满二叉树.(输出二叉树,节点总数,二叉树深度)

#include "stdio.h"#include "malloc.h"int count;typedef struct node{ char data; struct node *LChild; struct node *RChild;}BiTNode,*BiTree; void creatbitree(BiTree * bt) // 先序便历序列创建二叉树链表{ char ch=getchar(); if (ch=='#') {  *bt=NULL; } el

C++算法之 判断是否为平衡二叉树 求二叉树的镜像

1:判断是否为平衡二叉树: //方法1: int TreeDepth(BTree* pRoot) { if (pRoot == NULL) return 0; int nLeftDepth = TreeDepth(pRoot->m_pLeft); int nRightDepth = TreeDepth(pRoot->m_pRight); return (nLeftDepth > nRightDepth)? (nLeftDepth+1):(nRightDepth+1); } bool Is

二叉树(一)——二叉树的基本实现(数组实现和链表实现)

1.树是一种数据结构,树的一些相关的术语: 结点的度:一个结点的后继结点的个数. 树的度:树中度值最大的结点的度被称为树的度. 树的深度:树的层次数. 分支结点:度值大于0的结点,分支结点至少含有一个后继,分支结点也称为非终端结点. 叶子结点:树中的度值为0的结点. 双亲结点:树中某个结点的前驱结点,也成为父节点. 子女结点:树中某结点的后继结点. 兄弟结点:树中同一层的结点. 2.二叉树 (1)二叉树是一种特殊的树,树的度值最大为2. (2)二叉树的表示: A /      \ B     

二叉树的基本操作(顺序二叉树)

该代码的二叉树结点是数字,采用的是用数组存储,一般使用在空结点较少的情况,使用的时候,一定要清楚二叉树元素在数组中的存储顺序特点,比如左右子树序号有什么特点,怎么由孩子结点的找到双亲节点-- #include<iostream> #include<cmath> #include<cstdlib> using namespace std; const int MAX_TREE_SIZE=100; const int Nil=0; typedef int TElemType

SDUT 3343 数据结构实验之二叉树四:还原二叉树

数据结构实验之二叉树四:还原二叉树 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 给定一棵二叉树的先序遍历序列和中序遍历序列,要求计算该二叉树的高度. Input 输入数据有多组,每组数据第一行输入1个正整数N(1 <= N <= 50)为树中结点总数,随后2行先后给出先序和中序遍历序列,均是长度为N的不包含重复英文字母(区分大小写)的字符串. Output 输出一个整数,即该二叉树的

SDUT 3341 数据结构实验之二叉树二:遍历二叉树

数据结构实验之二叉树二:遍历二叉树 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 已知二叉树的一个按先序遍历输入的字符序列,如abc,,de,g,,f,,, (其中,表示空结点).请建立二叉树并按中序和后序的方式遍历该二叉树. Input 连续输入多组数据,每组数据输入一个长度小于50个字符的字符串. Output 每组输入数据对应输出2行:第1行输出中序遍历序列:第2行输出后序遍历序列

(转)数据结构:树、二叉树、最优二叉树

来源:http://www.cnblogs.com/coder2012/archive/2013/06/05/3102868.html 树 树形结构是一类非常重要的非线性结构,它可以很好地描述客观世界中广泛存在的具有分支关系或层次特性的对象,因此在计算机领域里有着广泛应用,如操作系统中的文件管理.编译程序中的语法结构和数据库系统信息组织形式等. 树的相关定义 节点的度:一个节点含有的子树的个数称为该节点的度: 树的度:一棵树中,最大的节点的度称为树的度: 叶节点或终端节点:度为零的节点: 非终端

HLG 2040 二叉树的遍历 (二叉树遍历之间的转换)

链接:http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=2040 Description: 给出一棵二叉树的中序和前序遍历,输出它的后序遍历. Input 本题有多组数据,输入处理到文件结束. 每组数据的第一行包括一个整数n,表示这棵二叉树一共有n个节点. 接下来的一行每行包括n个整数,表示这棵树的中序遍历. 接下来的一行每行包括n个整数,表示这棵树的前序遍历. 3<= n <= 1

完美二叉树, 完全二叉树和完满二叉树(国内教材到处是坑啊)

树在数据结构中占有非常重要的地位.本文从树的基本概念入手,给出完美(Perfect)二叉树,完全(Complete)二叉树和完满(Full)二叉树的区别.如果学习过二叉树,但是对这三种二叉树并没有深入的理解,或者完全被国产数据结构教科书所误导(只听说过满二叉树和完全二叉树)的朋友不妨花点时间耐着性子将本文仔细阅读N(>=1)遍. 1. 树(Tree)的基本概念 1.1 树的定义 A tree is a (possibly non-linear) data structure made up of