1 题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 2 思路和方法 (1)先在A中找和B的根节点相同的结点 (2)找到之后遍历对应位置的其他结点,直到B中结点遍历完,都相同时,则B是A的子树 (3)对应位置的结点不相同时,退出继续在A中寻找和B的根节点相同的结点,重复步骤,直到有任何一棵二叉树为空退出 3 C++核心代码 3.1 递归实现1 /* struct TreeNode { int val; struct TreeNode *left…
#include <iostream> #include <cstdio> #include <stdio.h> #include <string> #include <queue> #include <stack> using namespace std; class Node{ public : char data; struct Node *lchild,*rchild; }; class BiTree{ public: Nod…
// test20.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include<vector> #include<string> #include<queue> #include<stack> using namespace std; struct TreeNode { int val; struct TreeNode *left; struc…
错误代码: 最后两个if语句的目的是,最后一次迭代,两个链表中剩下的直接连接最后一次比较的数值,同时也是迭代停止的标志.虽然大if语句中比较大小得到的Node是正确的值,但每次迭代只要pHead2不为NULL都要改变正确的Node值为pHead2的值. class Solution { public: ListNode* Merge(ListNode* pHead1, ListNode* pHead2) { ListNode* Node = NULL; if(pHead1 != NULL &&am…
题目: 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 分析: 注意这道题是判断B是不是A的子结构,而不是子树,这一点要注意下,且空树不是任意一个树的子结构. 判断的时候我们要从A树的根节点开始判断B是不是A的结构,递归依次判断B是不是A的左子树和右子树的子结构. 在子结构的判断上,也就是从两个根节点开始判断是否相同,然后递归判断左右节点的val是否相同,当出现B中节点为null的时候,返回true.A中节点为null时,返回false,节点不相同也返…
题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 解析 解答 /** public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } */ public class Solution { public boolean HasSubtree(TreeNod…
1 题目描述 输入一棵二叉树,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度. 2 思路和方法 深度优先搜索,每次得到左右子树当前最大路径,选择其中较大者并回溯.int len = left>right?left+1:right+1;    // 当前最大路径 3 C++ 核心代码 /* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; Tre…
剑指Offer - 九度1521 - 二叉树的镜像2013-11-30 23:32 题目描述: 输入一个二叉树,输出其镜像. 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每个测试案例,输入的第一行为一个整数n(0<=n<=1000,n代表将要输入的二叉树节点的个数(节点从1开始编号).接下来一行有n个数字,代表第i个二叉树节点的元素的值.接下来有n行,每行有一个字母Ci.Ci=’d’表示第i个节点有两子孩子,紧接着是左孩子编号和右孩子编号.Ci=’l’表示第i个节点有一个左孩子,紧…
剑指Offer - 九度1350 - 二叉树的深度2013-11-23 00:54 题目描述: 输入一棵二叉树,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度. 输入: 第一行输入有n,n表示结点数,结点号从1到n.根结点为1. n <= 10. 接下来有n行,每行有两个个整型a和b,表示第i个节点的左右孩子孩子.a为左孩子,b为右孩子.当a为-1时,没有左孩子.当b为-1时,没有右孩子. 输出: 输出一个整型,表示树的深度.     样例…
剑指 Offer 28. 对称的二叉树 请实现一个函数,用来判断一棵二叉树是不是对称的.如果一棵二叉树和它的镜像一样,那么它是对称的. 例如,二叉树 [1,2,2,3,4,4,3] 是对称的. 1 / \ 2 2 /\ /\ 3 4 4 3 但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的: 1 / \ 2 2 \ \ 3 3 示例 1: 输入:root = [1,2,2,3,4,4,3] 输出:true 示例 2: 输入:root = [1,2,2,null,3,nu…
题目:二叉树的深度 考点:知识迁移能力 题目描述:输入一棵二叉树,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度. 牛客网上的剑指offer题,我按从简单到难的排序来做了 思路:从根节点出发, 查询左子树的深度 , 获取右子树的深度,比较一下,取大的,再加一 .就是整个二叉树的深度   法一:递归 /** public class TreeNode { int val = 0; TreeNode left = null; TreeNode…
剑指 Offer 55 - I. 二叉树的深度 知识点:二叉树,递归 题目描述 输入一棵二叉树的根节点,求该树的深度.从根节点到叶节点依次经过的节点(含根.叶节点)形成树的一条路径,最长路径的长度为树的深度. 示例 输入:root = [4,2,7,1,3,6,9] 输出:[4,7,2,9,6,3,1] 解法一:递归法 函数功能:一个树的深度 1.终止条件:节点为空,深度为0: 2.该做什么:当前节点为根的树深度是左子树和右子树深度大的+1: 3.什么时候做:得知道子树的深度才能知道当前树:后序…
问题描述: 输入一棵二叉树和一个整数,打印出二叉树中结点指的和为输入整数的所有路径.从树的根结点开始往下一直到叶结点所经过的结点形成一条路径.二叉树结点的定义如下: public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } 思路:(待续)看了书上的思路大概明白了.但是还没想到怎么写代码...…
题目描述 输入一棵二叉树,判断该二叉树是否是平衡二叉树. 题目地址 https://www.nowcoder.com/practice/8b3b95850edb4115918ecebdf1b4d222?tpId=13&tqId=11192&rp=2&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking 思路 平衡二叉树:它是一棵空树,或者它的两个子树的高度差的绝对值不超过1,并且左右两棵子树都…
剑指Offer - 九度1368 - 二叉树中和为某一值的路径2013-11-23 03:46 题目描述: 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径. 输入: 每个测试案例包括n+1行: 第一行为2个整数n,k(1<=n<=10000),n表示结点的个数,k表示要求的路径和,结点编号从1到n. 接下来有n行.这n行中每行为3个整数vi,leftnode,rightnode,vi表示第i个结点的值,…
题目描述 输入一棵二叉树,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度. 题目分析 树的深度=左子树的深度和右子树深度中最大者+1 代码 function TreeDepth(pRoot) { if (pRoot === null) return 0; const leftDep = TreeDepth(pRoot.left); const rightDep = TreeDepth(pRoot.right); return Math.ma…
剑指Offer:对称的二叉树[28] 题目描述 请实现一个函数,用来判断一颗二叉树是不是对称的.注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的. 题目分析 Java题解 /* public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } */ public class Solution {…
  题目描述:   输入一棵二叉树,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度.   解题思路:   本题相对比较简单.根据二叉树深度的定义,我们有以下理解:如果一棵树只有一个结点,那么它的深度为1.如果根结点只有左子树而没有右子树,那么树的深度为其左子树深度加1:相反,如果根结点只有右子树而没有左子树,那么深度为右子树深度加1:如果既有左子树又有右子树,那么该树的深度为左.右子树深度的较大值加1.   因此,很明显本题应该使用递归的思…
剑指 Offer 52. 两个链表的第一个公共节点 Offer_52 题目详情 题解分析 可以使用两个指针 node1,node2 分别指向两个链表 headA,headB 的头结点,然后同时分别逐结点遍历. 当 node1 到达链表 headA 的末尾时,重新定位到链表 headB 的头结点:当 node2 到达链表 headB 的末尾时,重新定位到链表 headA 的头结点. 这样,当它们相遇时,所指向的结点就是第一个公共结点. java代码 package com.walegarrett.…
题目 剑指 Offer 52. 两个链表的第一个公共节点 思路1(栈) 若两个链表相遇,则从它开始相遇的地方到链表末尾应该都是相同的,那么我们可以将两个链表分别放入两个栈中,然后依次循环比较两个栈顶的节点,同时用pre记录上一个节点,直到当前两个栈顶节点不相等,那么pre节点就是他们开始相遇的地方 代码 public class Solution { public ListNode getIntersectionNode(ListNode headA, ListNode headB) { Lin…
剑指 Offer 55 - II. 平衡二叉树 Offer_55_2 题目描述 方法一:使用后序遍历+边遍历边判断 package com.walegarrett.offer; /** * @Author WaleGarrett * @Date 2021/2/9 20:58 */ /** * 题目描述:输入一棵二叉树的根节点,判断该树是不是平衡二叉树. * 如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树. */ import sun.reflect.generics…
题目:输入某二叉树的前序遍历和中序遍历结果,请重建出该二叉树.假设 输入的前序遍历和中序遍历的结果都不含重复的数字.例如输入前序遍历 序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建出如图 所示的二叉树并输出它的头结点.二叉树的定义如下: struct BinaryTreeNode { int m_nValue; BinaryTreeNode* m_pLeft; BinaryTreeNode* m_pRight; } / \ / / \ \ / 首先…
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 请实现一个函数,用来判断一棵二叉树是不是对称的.如果一棵二叉树和它的镜像一样,那么它是对称的. 思路 还是画图分析,不用分析根结点,只需要分析左右子树.可以看出,左右子树刚好是呈镜像的两颗二叉树,所以:对左子树采用(父-左-右)的前序遍历,右子树采用(父-右-左)的前序遍历,遍历时判断两个结点位置的值是否相等即可.(也可以这样理解:左树的左子树等于右树的右子树,左树的右子树…
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入两个链表,找出它们的第一个公共结点. 思路 蛮力法:遍历第一个链表的结点,每到一个结点,就在第二个链表上遍历每个结点,判断是否相等.时间复杂度为O(m*n),效率低: 使用栈:由于公共结点出现在尾部,所以用两个栈分别放入两个链表中的结点,从尾结点开始出栈比较.时间复杂度O(m+n),空间复杂度O(m+n). 利用长度关系:计算两个链表的长度之差,长链表先走相差的步数,之…
说明: 1.本系列是根据<剑指Offer>这个系列做的一个小笔记. 2.直接动力是因为师兄师姐找工作很难,而且机械出生的我面试算法更难. 3.刚开始准备刷LeetCode.LintCode,突然看见一个大神研究生正在刷这个系列,故跟着大神学习. 4.在别人基础之上进行部分优化,总结自己的观点. 题目: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,…
本博文是原创博文,转载请注明出处! # 本文为牛客网<剑指offer>刷题笔记 1.题目 # 输入某二叉树的前序遍历和中序遍历的结果,重建二叉树 2.思路(递归) # 前序遍历中,第一个数字是二叉树的根节点 # 中序遍历中,根节点的左侧是左子树的节点,根节点的右侧是右子树的节点. 3.code # 返回值:指向二叉树节点的指针 # 函数参数:前序遍历结果vector,中序遍历结果vector /** * Definition for binary tree * struct TreeNode…
代码来源与<剑指offer> 得到从根节点开始到输入的两个结点的两条,需要遍历两次树,每遍历一次的时间复杂度是O(n),得到的两条路径的长度在最差情况时是O(n),通常情况下两条路径的长度是O(logn). #include <iostream> #include <vector> #include <list> using namespace std; struct TreeNode { int m_nValue; std::vector<TreeN…
面试题6:重建二叉树 题目描述: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建出图2.6所示的二叉树并输出它的头结点.二叉树结点的定义如下: class Node{ int e; Node left; Node right; Node(int x) { e = x; } } 这道题主要测试你对二叉树性质的了解,非常有代表…
该题目来源于牛客网<剑指offer>专题. 请实现一个函数,用来判断一颗二叉树是不是对称的.注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的. Go语言实现: 方法一:递归 /** * Definition for a binary tree node. * type TreeNode struct { * Val int * Left *TreeNode * Right *TreeNode * } */ func isSymmetric(root *TreeNode) bool…
该题目来源于牛客网<剑指offer>专题. 输入两个链表,找出它们的第一个公共结点. Go语言实现: //长度长的先走个长度差,然后ab一起比较后面结点 //长度一样,公共结点可能在首结点,即a=b //长度不一样,公共结点如果存在,只能在长度差之后 func findFirstCommonNode(a, b *ListNode) *ListNode { lenA := getListNodeLen(a) lenB := getListNodeLen(b) //对齐长度差 if lenA &g…