树的子结构(剑指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中是否有B,则,先找到B的根节点在A中的位置,然后再从结点出发,比较左右子树是否相等;

我对树的题不是很擅长,本来想自己先个建树的,结果,居然木有输出了。。。无奈啊。

我的建树思路是先把没个数入队,然后取数,入栈,。。。每个出栈的结点从队里面取左右结点入栈,用链表;

对了,上面在A中找到B的根节点后,递归判断退出的条件是B到达NULL,返回 true,或者A结点的值和B结点的值不等+或者A比B先到NULL,返回false;否则递归该结点的左右结点;

/*
struct TreeNode {
	int val;
	struct TreeNode *left;
	struct TreeNode *right;
	TreeNode(int x) :
			val(x), left(NULL), right(NULL) {
	}
};*/
class Solution
{
public:
    bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
    {
        bool bo=false;
        if(pRoot1 && pRoot2)
        {
            if(pRoot1->val==pRoot2->val) bo=JudgeTree(pRoot1,pRoot2);
            if(!bo) bo=HasSubtree(pRoot1->left,pRoot2);
            if(!bo) bo=HasSubtree(pRoot1->right,pRoot2);
        }
        return bo;
    }
    bool JudgeTree(TreeNode *p1,TreeNode *p2)
    {
        if(!p2) return true;
        if(!p1) return false;
        if(p1->val!=p2->val) return false;
        return JudgeTree(p1->left,p2->left) && JudgeTree(p1->right,p2->right);
    }

};

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-12 22:58:13

树的子结构(剑指offer)递归的相关文章

树的子结构-剑指Offer

树的子结构 题目描述 输入两颗二叉树A,B,判断B是不是A的子结构. 思路 分两步来实现 先判断Tree1里的节点有没有和Tree2的根节点相同值得节点,递归的判断,若有,侧判断第二步,否则,返回false 从这个有相同值的节点开始判断,递归的左右对应的判断子树是否相等,注意空指针的情况 注意:在编写遍历树的代码时一定要高度警惕,在每一处要访问地址的时候都要问问自己这个地址有没有可能是NULL,如果是该怎么处理.(为了确保自己代码的完整正确,写完代码后要多用几个测试用例检验自己的程序) 代码 /

《剑指offer》题解

有段时间准备找工作,囫囵吞枣地做了<剑指offer>提供的编程习题,下面是题解收集. 当初没写目录真是个坏习惯(-_-)||,自己写的东西都要到处找. 剑指Offer - 九度1524 - 复杂链表的复制 剑指Offer - 九度1509 - 树中两个结点的最低公共祖先 剑指Offer - 九度1508 - 把字符串转换成整数 剑指Offer - 九度1504 - 把数组排成最小的数 剑指Offer - 九度1503 - 二叉搜索树与双向链表 剑指Offer - 九度1390 - 矩形覆盖 剑

【剑指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之树的子结构(九度OJ1520)

题目描述: 输入两颗二叉树A,B,判断B是不是A的子结构. 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每个测试案例,输入的第一行一个整数n,m(1<=n<=1000,1<=m<=1000):n代表将要输入的二叉树A的节点个数(节点从1开始计数),m代表将要输入的二叉树B的节点个数(节点从1开始计数).接下来一行有n个数,每个数代表A树中第i个元素的数值,接下来有n行,第一个数Ki代表第i个节点的子孩子个数,接下来有Ki个树,代表节点i子孩子节点标号.接下来m+1行,与

剑指Offer对答如流系列 - 树的子结构

面试题26:树的子结构 问题描述 输入两棵二叉树A和B,判断B是不是A的子结构.二叉树的定义如下: public class TreeNode{ double val; TreeNode left = null; TreeNode right =null; public TreeNode(int val) { this.val=val; } } 比如下面的 B是A的子结构 问题分析 看了看<剑指Offer>高质量代码章节的面试题,发现难度都不高,但是没有分析好边界条件亦或是想当然就是容易出错,

【剑指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

剑指OFFER(百度笔试)——二叉树的子结构

百度软件开发实习生笔试: 1.模拟短作业优先调度算法,计算平均等待时间,例如输入[0,2,4,8]表示四个作业分别是第0s到.第2s到.第4s到.第8s到.[2,1,6,3]表示四个作业的运行时间. 计算平均等待时间.每个作业的等待时间:实际开始时间-到达时间.(不可剥夺) 2.二叉树的子结构,输入两棵树A.B,判断B是不是A的子树.剑指offer也有,拿出来一起做了. /* struct TreeNode { int val; struct TreeNode *left; struct Tre

剑指offer之树

//Tree in 剑指offer /* 面试题7:重建二叉树 输入某二叉树的前序遍历和中序遍历的结果,请重建 该二叉树. */ typedef struct BinaryTreeNode{ int m_nValue; BinaryTreeNode* m_pLeft; BinaryTreeNode* m_pRight; }BinaryTreeNode; BinaryTreeNode* Construct(int *preorder, int *inorder, int length) { if(

剑指Offer——Trie树(字典树)

剑指Offer--Trie树(字典树) Trie树 Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种.典型应用是统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计.它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高. Trie的核心思想是空间换时间.利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的. Trie树也有它的缺点,Trie树的内存消耗非常大.当然,或许用左儿子右兄弟的方法建树的话,可能会好点.可见,优

剑指offer (9) 递归和迭代 斐波那契数列

通常基于递归实现的代码比基于循环实现的代码要简洁很多 比如 二叉树遍历以及 二叉树的许多操作 递归由于是函数调用自身,每一次函数调用,都需要在内存栈中分配空间以保存参数.返回地址以及临时变量 而每个进程的栈容量是有限的,当递归调用的层级太多时,就会导致 调用栈溢出 递归有时伴随大量重复的计算, 二叉树遍历的递归操作不存在重复计算,因为每个结点的左右子树是严格区分开的 例如求解 斐波那契数列: 解题分析 int fib(int n) { assert(n >= 0); int prevTwo =