剑指Offer-4.重建二叉树(C++/Java)】的更多相关文章

剑指Offer:重建二叉树[7] 题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回. 分析 我们首先要明白前序和中序构建二叉树的流程,流程理解了才是解题的关键: 如上图所示,前序遍历可以找到头结点,然后在中序遍历中找到它的位置 比如,1的位置为i,那么startIn~i-1就是它的左子树的中序遍历,st…
本题来自<剑指offer> 重构二叉树 题目: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回. 思路: 二叉树的前序遍历:根左右,第一个值是根节点 二叉树的中序遍历:左根右,根节点的值在中间,左子树的节点在根的左边,右子树的节点在根的右边 首先找到前序的根节点,继而对应到中序中,分离出中序的根左.右子树.…
本文参考自<剑指offer>一书,代码采用Java语言.  更多:<剑指Offer>Java实现合集 题目 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1, 2, 4, 7, 3, 5, 6, 8}和中序遍历序列{4, 7, 2, 1, 5, 3, 8, 6},则重建出其二叉树并输出它的头结点. 思路 前序遍历第一个值就是根结点的值,根据该值在中序遍历的位置,可以轻松找出该根结点左右子树的前序…
该题目来源于牛客网<剑指offer>专题. 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回. Go语言实现: type TreeNode struct { Val int Left *TreeNode Right *TreeNode } func reConstructBinaryTree(pre, mid…
1.问题描述:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.        例如输入前序遍历序列pre {1,2,4,7,3,5,6,8}和中序遍历序列in {4,7,2,1,5,3,8,6},则重建二叉树并返回. 2.解题思路:我们知道,根据一个二叉树的前序遍历结果和中序遍历结果可以推导出这棵二叉树的结构:前序遍历:中左右:中序遍历:左中右:例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5…
题目描述: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并输出它的后序遍历序列. 输入: 输入可能包含多个测试样例,对于每个测试案例, 输入的第一行为一个整数n(1<=n<=1000):代表二叉树的节点个数. 输入的第二行包括n个整数(其中每个元素a的范围为(1<=a<=1000)):代表二叉树的前序…
重建二叉树的前置知识: 0.遍历二叉树: (1)前序遍历:根左右 --> 先访问根节点,再前序遍历左子树,最后前序遍历右子树: (2)中序遍历:左根右 --> 先中序遍历左子树,再访问根节点,最后中序遍历右子树. (3)后序遍历:左右根 --> 先后序遍历左子树,再后序遍历右子树,组后访问根节点. 1.重建二叉树: (1)前序+中序:前序遍历序列和中序遍历序列可以确定唯一的二叉树 (2)中序+后序:中序遍历序列和后序遍历序列可以确定唯一的二叉树 2.构建整个二叉树和构建子二叉树的过程相同…
题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回. 题目地址 https://www.nowcoder.com/practice/8a19cbe657394eeaac2f6ea9b0f6fcf6?tpId=13&tqId=11157&tPage=1&rp=2&ru=%2Fta%2F…
一.题目: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回. 二.思路: 前序的第一个是根,中序的中间是根,所以,找前序的第一个数作为根,再从中序中把跟找出来,那么中序跟位置左边是左子树,右边是右子树,递归即可.注意要把根构造出树的形式,而不是只是一个数,注意空树. 三.代码:     …
思路:在数据结构中,有一个条件反射,谈及二叉树,就递归.所以在实现重建二叉树时,也应该用到递归的思想. 在前序遍历中,根节点处于第一个:在中序遍历中,根节点的左边为左子树节点,根节点右边为右子树节点. 根据性质构造根节点. 1.取出前序遍历的第一个节点作为根节点 2.在中序遍历中按照根节点分割左子树和右子树 3.递归 代码: class Solution:     # 返回构造的TreeNode根节点     def reConstructBinaryTree(self, pre, tin):…
题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回.   已知中序遍历和前序遍历,可以得到唯一的二叉树   class Solution { public: TreeNode* reConstructBinaryTree(vector<int> pre, vector<int> vin) {…
输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字. 抓住一点,通过递归进行节点创建时,是按照 前序遍历数组 进行创建的. 根节点,根节点的左孩子.右孩子 TreeNode node = recur(root); //创建根节点 node.left = recur(root + 1); //创建左子树 node.right = recur(root + ??); //创建右子树 ?? 就需要通过中序遍历来确定. 那么怎么确定?? -- 需…
链接:https://leetcode-cn.com/problems/zhong-jian-er-cha-shu-lcof/ 标签:树.递归 题目 输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字. 例如,给出 前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3 / \ 9 20 / \ 15 7 限制: 0 <= 节点个数 <= 5000 分…
题目:http://www.nowcoder.com/practice/8a19cbe657394eeaac2f6ea9b0f6fcf6 C++ /** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solutio…
不用迭代器的代码 class Solution { public: TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) { TreeNode* root = NULL; int length_pre = pre.size(); int length_vin = vin.size(); || length_vin <= ) return root; ,length_pre-,,length_vin-)…
/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: TreeNode* reConstructBinaryTree(vector<int> pre,vector<in…
这是剑指offer中关于二叉树重构的一道题.题目原型为: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回. 一.二叉树的数据结构 做题之前,我们先熟悉下二叉树的数据结构.其一,定义:二叉树是一个连通的无环图,并且每一个顶点的度不大于3.有根二叉树还要满足根结点的度不大于2.有了根结点之后,每个顶点定义了唯一的父…
剑指 Offer 68 - II. 二叉树的最近公共祖先 Offer_68_2 题目详情 题解分析 java代码 package com.walegarrett.offer; /** * @Author WaleGarrett * @Date 2021/2/16 14:01 */ /** * 题目描述:给定一个二叉树, 找到该树中两个指定节点的最近公共祖先. */ public class Offer_68_2 { public TreeNode lowestCommonAncestor(Tre…
剑指 Offer 37. 序列化二叉树 Offer_37 题目描述 题目解析 本题主要考察的就是二叉树的层次遍历. 层次遍历时可以根据二叉树的特点将空结点也进栈. 反序列化时同样可以根据层次遍历的思路,每次生成当前结点的左右子树指针结点. java代码 package com.walegarrett.offer; /** * @Author WaleGarrett * @Date 2021/2/4 23:01 */ import java.util.LinkedList; import java…
目录 题目 思路 代码 复杂度分析 题目 剑指 Offer 37. 序列化二叉树 思路 序列化其实就是层序遍历 但是,要能反序列化的话,前.中.后.层序遍历是不够的,必须在序列化时候保存所有信息,这样子反序列化才可以完全恢复一颗树 利用层序遍历,在遍历时候同时计算序列化结果,注意最后一个没有逗号 反序列化其实也是使用了层序遍历 由于起始位置是0,可以得出,索引位置为n的结点他的左孩子的索引为n*2+1,右孩子索引为n*2+2 从头开始遍历结点时候,判断孩子是否为null:不为null才为其构造结…
剑指 Offer 68 - II. 二叉树的最近公共祖先 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:"对于有根树 T 的两个结点 p.q,最近公共祖先表示为一个结点 x,满足 x 是 p.q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)." 例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4] 示例 1: 输入: root = [3,5,1,6,2,0,8,null,null,7…
题目 剑指 Offer 55 - I. 二叉树的深度 思路1(DFS) 后续遍历吧,先遍历到最深(递归到末尾返回0),然后从后面一步一步比较取大的值返回,每次返回层数都加1, 执行流程是怎样的:比如其中一个节点左子树为空,右子树有一个叶子节点,那么 0 > 1 ,肯定选 1 ,再加上当前一层 1 ,返回 2 给父节点:然后到了父节点对两个子节点的比较,其中一个节点就是刚才的 2 ,如果另一个返回的深度为4,那么就取 4 ,再加上当前的 1 返回 5 给它的父节点--直到返回到根节点,此时就得到了…
[剑指Offer]序列化二叉树 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews 题目描述: 请实现两个函数,分别用来序列化和反序列化二叉树 解题方法 同样是LeetCode的原题,这里再复习一遍.采用Leetcode的官方序列化二叉树的方式,采用#表示空节点,树的前序遍历表示这个树.解序列化需要用一个队列. 代码: # -*- coding:utf-8 -*- # class Tr…
[剑指Offer]把二叉树打印成多行 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews 题目描述: 从上到下按层打印二叉树,同一层结点从左至右输出.每一层输出一行. 解题方法 比上题的之字形遍历还容易点,直接层次遍历即可.下面的这个递归的解法要背会. 代码: # -*- coding:utf-8 -*- # class TreeNode: # def __init__(self, x…
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 请实现两个函数,分别用来序列化和反序列化二叉树. 思路 一般情况下,需要采用前/后序遍历和中序遍历才能确定一个二叉树,但是其实可以只采用前序遍历(从根结点开始),将空结点(null)输出为一个特殊符号(如“$”),就可以确定一个二叉树了. 将二叉树序列化为字符串,就是前序遍历的过程,遇见空结点时,序列化为“$”,每个结点间使用逗号分隔开. 将字符串反序列化为二叉树,也使用前…
1.二维数组中的查找 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. public class Solution { public boolean Find(int target, int [][] array) { if(array == null||array.length==0) return false; int rowIdx = 0,colIdx = array[0]…
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/mmc_maodun/article/details/27242575 转载请注明出处:http://blog.csdn.net/ns_code/article/details/27242575     题目:输入一个二叉树的根节点,推断该树是不是平衡二叉树.假设某二叉树中随意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树.     剑指offer上给的另外一种思路.用后序遍历真的是将递…
该题目来源于牛客网<剑指offer>专题. 请实现两个函数,分别用来序列化和反序列化二叉树. 二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存.序列化可以基于先序.中序.后序.层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 !表示一个结点值的结束(value!). 二叉树的反序列化是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树. Go语言实现: type…
该题目来源于牛客网<剑指offer>专题. 从上到下按层打印二叉树,同一层结点从左至右输出.每一层输出一行. 需要分层,二维数组. Go语言实现: /** * Definition for a binary tree node. * type TreeNode struct { * Val int * Left *TreeNode * Right *TreeNode * } */ func levelOrder(root *TreeNode) [][]int { var result [][]…
剑指 Offer 27. 二叉树的镜像 知识点:二叉树:递归:栈 题目描述 请完成一个函数,输入一个二叉树,该函数输出它的镜像. 示例 输入:root = [4,2,7,1,3,6,9] 输出:[4,7,2,9,6,3,1] 解法一:递归法 函数功能:二叉树镜像: 1.终止条件:root==null的时候,返回null: 2.每个节点该做什么:将两个孩子节点互换: 3.什么时候做:递去的时候或者回来的时候都行(前序或者后序都行) /** * Definition for a binary tre…