树的子结构——18

输入两棵二叉树A和B,判断B是不是A的子结构。如图:二叉树B就是二叉树A的一棵子树,而二叉树C不是二叉树A的子树。

上图可以发现,判断一棵树是不是另一棵树的子树,可以从一棵树的根结点开始遍历,直到找到另一棵树的根结点开始,就依次比较两棵树的左右子树,再次直到比较到两棵树的叶子结点为止,如果中途有任意一个结点不等,那么树B就不是另一棵A的子树,否则,就是其子树,可以用递归来实现;

程序设计如下:

#include <iostream>
#include <assert.h>
#include <string.h>
using namespace std;

struct BinaryTreeNode//树结点结构体
{
    int _val;
    BinaryTreeNode* _Lchild;
    BinaryTreeNode* _Rchild;

    BinaryTreeNode(int val)//构造函数
        :_val(val)
        ,_Lchild(NULL)
        ,_Rchild(NULL)
    {}  
};

BinaryTreeNode* _CreatTree(const int *arr, size_t& index, size_t size)//创建二叉树
{
    if((arr[index] != ‘#‘) && (index < size))
    {   
        BinaryTreeNode *root = new BinaryTreeNode(arr[index]);
        root->_Lchild = _CreatTree(arr, ++index, size);
        root->_Rchild = _CreatTree(arr, ++index, size);
        return root;
    }   
    else
        return NULL;
};

BinaryTreeNode* CreatTree(const int *arr, size_t size)
{
    assert(arr && size);

    size_t index = 0;
    return _CreatTree(arr, index, size);
}

bool Judge(BinaryTreeNode* father, BinaryTreeNode* child)//递归判断子树是否存在
{
    //如果父子都到了叶子结点,说明当前子树是相等的
    //如果任意结点不相等,则一定不是子树
    //如果一棵树到达了叶子结点而另一棵还没有到达叶子结点,那么一定不是子树
    if((father == NULL) && (child == NULL))
        return true;
    else if((father != NULL) && (child != NULL))
    {
        if(father->_val != child->_val)
            return false;
    }
    else
        return false;

    //返回结果应该是左右结点都完全相等
    bool ret = Judge(father->_Lchild, child->_Lchild) && Judge(father->_Rchild, child->_Rchild);

    return ret;
}

//在父类书中寻找与要判断子树根结点相等的结点
bool JudgeChildTree(BinaryTreeNode* father, BinaryTreeNode* child)
{
    bool ret = false;
    //如果其中一棵树为空,则子树不在当前父类树中
    if((father == NULL) || (child == NULL))
        return ret;
    //如果当前结点等于要判断子树的根结点,则进行完全比较
    if(father->_val == child->_val)
        ret = Judge(father, child);

    //当结果不为真的时候,才进行继续寻找,否则说明判断成功,就不再继续遍历
    if(!ret)
        ret = JudgeChildTree(father->_Lchild, child);
    if(!ret)
        ret = JudgeChildTree(father->_Rchild, child);

    return ret;
}

void PrevOrder(BinaryTreeNode *root)//前序遍历打印树结点
{
    if(root != NULL)
    {
        cout<<root->_val<<"->";
        PrevOrder(root->_Lchild);
        PrevOrder(root->_Rchild);
    }
}

void DestoryTree(BinaryTreeNode *root)//销毁树
{
    if(root != NULL)
    {
        delete root;
        DestoryTree(root->_Lchild);
        DestoryTree(root->_Rchild);
    }
}

int main()
{
    int arr1[] = {1,2,4,‘#‘,‘#‘,5,8,‘#‘,‘#‘,‘#‘,3,6,‘#‘,‘#‘,7,‘#‘,9,‘#‘,‘#‘};
    int arr2[] = {3,6,‘#‘,‘#‘,7,‘#‘,9,‘#‘,‘#‘};
    int arr3[] = {2,4,‘#‘,‘#‘,5,‘#‘,‘#‘};

    BinaryTreeNode *father = CreatTree(arr1, sizeof(arr1)/sizeof(arr1[0]));
    BinaryTreeNode *child1 = CreatTree(arr2, sizeof(arr2)/sizeof(arr2[0]));
    BinaryTreeNode *child2 = CreatTree(arr3, sizeof(arr3)/sizeof(arr3[0]));

    PrevOrder(father);
    cout<<"NULL"<<endl;
    PrevOrder(child1);
    cout<<"NULL"<<endl;
    PrevOrder(child2);
    cout<<"NULL"<<endl;
    
    bool ret = JudgeChildTree(father, child1);
    cout<<ret<<endl;
    ret = JudgeChildTree(father, child2);
    cout<<ret<<endl;

    DestoryTree(father);
    DestoryTree(child1);
    DestoryTree(child2);

    return 0;
}

运行程序:

《完》

时间: 2024-09-30 15:21:13

树的子结构——18的相关文章

剑指offer 18:树的子结构

题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 解题思路 验证B是不是A的子树,直觉做法,按照任意次序遍历A树,一旦出现和B树根节点相同的子节点,就将以此节点为根的子树与B树相比较,满足则查找成功,否则查找失败.树的先序遍历最为直观,此处以先序遍历为例,给出C++实现代码: /* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode

【剑指offer】树的子结构

转载请注明出处:http://blog.csdn.net/ns_code/article/details/25907685 剑指offer第18题,九度OJ上测试通过! 题目描述: 输入两颗二叉树A,B,判断B是不是A的子结构. 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每个测试案例,输入的第一行一个整数n,m(1<=n<=1000,1<=m<=1000):n代表将要输入的二叉树A的节点个数(节点从1开始计数),m代表将要输入的二叉树B的节点个数(节点从1开始计数).

剑指offer之树的子结构

题目: 树的子结构 链接: https://www.nowcoder.com/practice/6e196c44c7004d15b1610b9afca8bd88?tpId=13&tqId=11170&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking 题目描述: 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 思路: 分为两步: 第一步:

剑指offer——树的子结构 (JAVA代码)

版权声明:本文为博主原创文章,未经博主允许不得转载. 题目描述: 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构). 解题思路: 首先看牛客网给出的测试用例: 一般对于树的操作不像链表一样,操作更复杂,如果使用循环遍历的话,对于非完全二叉树规律难寻,一般通用的方法就是使用递归求解,本题也不例外,同样使用递归求解,求解的大体思路是首先判断B的根节点和A的根节点是否相同(这里的相同是指节点的值相同并且左右子节点相同),如果相同比较他们的左右子节点,这一步骤是

树的子结构(剑指offer)递归

树的子结构 参与人数:1611时间限制:1秒空间限制:32768K 通过比例:18.19% 最佳记录:0 ms|0K(来自  mearo) 题目描述 输入两颗二叉树A,B,判断B是不是A的子结构. 链接:http://www.nowcoder.com/practice/6e196c44c7004d15b1610b9afca8bd88?rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking 思路:判断A

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

【二叉树】树的子结构

输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 1 /** 2 public class TreeNode { 3 int val = 0; 4 TreeNode left = null; 5 TreeNode right = null; 6 7 public TreeNode(int val) { 8 this.val = val; 9 10 } 11 12 } 13 */ 14 public class Solution { 15 public b

剑指offer——树的子结构

题目链接:输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 解题思路: 递归的方法,先判断根节点,如果相等,判断左子树以及右子树. 1 /** 2 public class TreeNode { 3 int val = 0; 4 TreeNode left = null; 5 TreeNode right = null; 6 7 public TreeNode(int val) { 8 this.val = val; 9 10 } 11 12 } 13

【剑指Offer】17、树的子结构

题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 题解:递归 1 public static boolean HasSubtree(TreeNode root1,TreeNode root2) { 2 if(root1==null||root2==null){ 3 return false; 4 } 5 return tree1HasTree2(root1,root2)||HasSubtree(root1.left,root2)||HasSub