树的子结构19

原创 2016年05月31日 22:10:26

题目描述:输入两棵二叉树A和B,判断B是不是A的子结构。二叉树结点的定义如下:

//二叉树的定义
struct BinTreeNode{
  int m_value;
  BinTreeNode *left;
  BinTreeNode *right;
  //创建根节点,值为e
  BinTreeNode* createRoot(int e);
  //将e作为当前结点的左孩子值插入
  void insertAsLC(int e);
  //将e作为当前结点的右孩子值插入
  void insertAsRC(int e);
};

//创建根节点,值为e
BinTreeNode* BinTreeNode::createRoot(int e){
     BinTreeNode *root = new BinTreeNode;
     root->m_value = e;
     return root;
 }

//作为节点的左孩子插入元素e
void BinTreeNode::insertAsLC(int e){
    BinTreeNode *Left = new BinTreeNode;
    Left->m_value = e;
    this->left = Left;
}

//作为节点的右孩子插入元素e
void BinTreeNode::insertAsRC(int e){
    BinTreeNode *Right = new BinTreeNode;
    Right->m_value = e;
    this->right = Right;
}

解题思路:

  1. 两棵树是否为空的情况;
  2. 如果有A、B两棵树,验证B树是不是A树中的一颗子树;
  3. 需要先对比根节点
  4. 若根节点相同,则对比左右子节点
  5. 若左右子节点不同,则需要继续在A树中查找与B树根节点相等的节点。

测试用例:

int main(){
    //创建一颗A树
    BinTreeNode *A = new BinTreeNode;
    A->m_value = 8;

    A->insertAsLC(8);
    A->insertAsRC(7);

    A->left->insertAsLC(9);
    A->left->insertAsRC(2);
    A->left->right->insertAsLC(4);
    A->left->right->insertAsRC(7);


    //创建一棵B树
    BinTreeNode *B = new BinTreeNode;
    B->m_value = 8;

    B->insertAsLC(9);
    B->insertAsRC(2);

    //判断B是不是A的子树
    bool result = HasSubTree(A, B);  //Output: Sub Tree
    //判定结果
    if(result)
        std::cout << "Sub Tree\n";
    else
        std::cout << "Isn't sub tree\n";

    return 0;
}

函数实现:

//DoesTree1HaveTree2函数
bool DoesTree1HaveTree2(BinTreeNode *A_Root, BinTreeNode *B_Root){
    //进入此函数说明根节点相等
    if(!B_Root)//如果B树为空,则为真
        return true;
    if(!A_Root)
        return false;
    if(A_Root->m_value != B_Root->m_value)
        return false;
    return DoesTree1HaveTree2(A_Root->left, B_Root->left) && DoesTree1HaveTree2(A_Root->right, B_Root->right);
}

//主函数实现
bool HasSubTree(BinTreeNode *A_Root, BinTreeNode *B_Root){
    bool result = false;
    if(A_Root != NULL && B_Root != NULL){
        //先对比根节点
        if(A_Root->m_value == B_Root->m_value){//若想等,对比子树节点
           result = DoesTree1HaveTree2(A_Root, B_Root);
        }
        //再分别判断左右子树
        if(!result)
            result = HasSubTree(A_Root->left, B_Root);
        if(!result)
            result = HasSubTree(A_Root->right, B_Root);
    }
    return result;
}
版权声明:本文为博主原创文章,转载请注明出处。

二叉树的子树和子结构的几个问题

子树的意思是包含了一个节点,就得包含这个节点下的所有节点,一棵大小为n的二叉树有n个子树,就是分别以每个节点为根的子树。 子结构的意思是包含了一个节点,可以只取左子树或者右子树,或者都不取。 ...
  • binling
  • binling
  • 2015年08月26日 13:09
  • 1145

基本数据结构——二叉树的建立,遍历,求叶子节点,深度计算

/* 新建立一棵二叉树,遍历,查找树的高度,查找树的叶子节点,和总结点数计算距离最远的两个节点。 SQ 2014-04-20 */ #include struct Node{     ...
  • u012606764
  • u012606764
  • 2014年04月20日 21:55
  • 1591

Java编程:将具有父子关系的数据库表数据转换为树形结构,支持无限层级

在平时的开发工作中,经常遇到这样一个场景,在数据库中存储了具有父子关系的数据,需要将这些数据以树形结构的形式在界面上进行展示。本文的目的是提供了一个通用的编程模型,解决将具有父子关系的数据转换成树形结...
  • claram
  • claram
  • 2017年01月19日 15:17
  • 5577

剑指offer(19):树的子结构

题目描述输入两颗二叉树A,B,判断B是不是A的子结构。分析 有关树的操作一般是通过递归遍历来实现的。...
  • u011080472
  • u011080472
  • 2016年04月26日 10:44
  • 415

树的子结构(剑指offer18)

题目:输入两棵二叉树A和B,判断B是不是A的子结构。二叉树的结点定义如下:...
  • u010119170
  • u010119170
  • 2014年04月27日 21:30
  • 517

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

方法一:最简单就是首先判断两棵树的根节点是否相同,如果相同则判断两颗树的左节点是否对应,右结点是否对应, 如果两个根节点值不同,主树左节点与子树根节点判断,主树右结点与子树根节点判断,然后再判断对应...
  • sinat_28108651
  • sinat_28108651
  • 2016年06月25日 16:00
  • 751

【剑指Offer】面试题18:树的子结构

思路整理自剑指Offer 一:题目描述 输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构) 二:解题思路 要查找树A中找到和树B结构一样的子树:...
  • u010059070
  • u010059070
  • 2017年07月26日 19:44
  • 131

剑指offer 树的子结构

树的子结构题目描述 输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构) 我的解答题意这道题目我是在牛客网上做的,题目叙述过于简答,坑了我半天,我的理解是一棵...
  • jianloubang5433
  • jianloubang5433
  • 2016年07月20日 11:31
  • 445

【剑指Offer面试编程题】题目1520:树的子结构--九度OJ

一看到树,第一想法就是递归,虽然递归的效率确实不高,但在OJ上讲究时间效率,有时候配合适当的剪枝能快速AC。本题需要两层递归,首先我们要确定A树的哪个子树与B树进行比照,也就是确定A树的子节点,这是第...
  • huoyaotl123
  • huoyaotl123
  • 2014年12月20日 19:59
  • 481

剑指offer 18. 树的子结构

// 题目:给出两个树,判断B是否是A的子结构 // 解法:递归的进行,转换每一个节点 public class Main { public static void main(String[] ...
  • u011438605
  • u011438605
  • 2017年05月10日 08:32
  • 381
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:树的子结构19
举报原因:
原因补充:

(最多只允许输入30个字)