树的子结构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;
}
版权声明:本文为博主原创文章,转载请注明出处。

相关文章推荐

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

题目描述输入两颗二叉树A,B,判断B是不是A的子结构。分析 有关树的操作一般是通过递归遍历来实现的。...

剑指offer 树的子结构

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

剑指offer-面试题18.树的子结构

题目:输入两棵二叉树A和B,判断B是不是A的子结构。 二叉树节点定义如下: 1 struct BinaryTreeNode 2 { 3 int m_nValu...

剑指offer 18. 树的子结构

// 题目:给出两个树,判断B是否是A的子结构 // 解法:递归的进行,转换每一个节点 public class Main { public static void main(String[] ...

剑指offer:树的子结构

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

笔试面试算法经典--二叉树的子结构(Java)

题目描述 输入两棵二叉树A,B,判断B是不是A的子结构(空树不是任意一个树的子结构)。下图中:右边的二叉树是左边二叉树的子结构解法: 先序遍历 A树,如果当前节点与 B树的根节点相同,则判断 B ...

剑指offer面试题18:树的子结构

题目:输入两棵二叉树A和B,判断B是不是A的子结构。 算法分析:         要查找树A中是否存在和树B结构一样的子树,我们可以分为两步,第一步:在树A中找到和...

求树的子结构

好长时间不更新博客了,今天看到一道以前做过的题(题目来自《剑指offer》),再练一下: 我的思路如下: 判断B是不是A的子结构,就是要判断B是不是和A中的一部分结构是不是完全相同...

码农小汪-剑指Offer之15-树的子结构

题目描述输入两颗二叉树A,B,判断B是不是A的子结构。题解:我们这个主要的问题就是,如何去判断一个是不是另一个的子树,首先一点。我们肯定涉及到对于树的值得比较,肯定会和遍历有关系啦。遍历最简单的递归去...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:树的子结构19
举报原因:
原因补充:

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