剑指offer-树
lupa1521
这个作者很懒,什么都没留下…
展开
-
重建二叉树
题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。 思路: 前序遍历序列第一个值为树根,中序遍历树根之前的数是根的左子树,之后的数是右子树 根1,左子树4,7,2,右子树5,3,8,6 递归左子...原创 2019-04-06 12:20:50 · 130 阅读 · 0 评论 -
18 二叉树的镜像
思路:根节点不空时,左孩子右孩子交换 左孩子不空,递归调用左子树 右孩子不空,递归调用右子树 public class Solution { public void Mirror(TreeNode root) { TreeNode temp=null; if(root!=null) { temp=root.left; ...原创 2019-05-12 10:24:05 · 83 阅读 · 0 评论 -
17、树的子结构
思路: 先判断根节点值是否相等, 再判断左右节点值是否相等 递归 public class Solution { public boolean HasSubtree(TreeNode root1,TreeNode root2) { boolean result=false; if(root1!=null && root2!=null...原创 2019-05-12 10:23:59 · 82 阅读 · 0 评论 -
64、数据流中的中位数
如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。 思路: 创建优先级队列维护大顶堆和小顶堆两个堆,并且小顶堆的值都大于大顶堆的值,2个堆个数的差值小 于等于1,所...原创 2019-05-06 22:40:27 · 103 阅读 · 0 评论 -
63、二叉搜索树的第K个节点
题目描述 给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。 思路:中序遍历 public class Solution { int index = 0; //计数器 TreeNode KthNode(TreeNode root, int k) { if(root !=...原创 2019-05-06 22:26:38 · 66 阅读 · 0 评论 -
62、序列化二叉树
62.请实现两个函数,分别用来序列化和反序列化二叉树 思路:序列化:前序遍历二叉树存入字符串中;反序列化:根据前序遍历重建二叉树。 public class Solution { String Serialize(TreeNode root) { StringBuffer sb=new StringBuffer(); if(root==null) ...原创 2019-05-06 22:23:29 · 60 阅读 · 0 评论 -
61、之字形打印二叉树
60.请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序 打印,第三行按照从左到右的顺序打印,依此类推。 思路:利用两个栈的辅助空间分别存储奇数偶数层的节点,然后打印输出。或使用链表的辅助空间来实现,利 用链表的反向迭实现逆序输出。 public class Solution { public ArrayList<ArrayList&...原创 2019-05-05 23:24:29 · 98 阅读 · 0 评论 -
60、把二叉树打印成多行
题目描述 从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。 public class Solution { ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) { ArrayList<ArrayList<Integer>> res=new ArrayL...原创 2019-05-05 23:11:14 · 65 阅读 · 0 评论 -
59、对称的二叉树
59.请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样 的,定义其为对称的。 思路:利用递归进行判断,若左子树的左孩子等于右子树的右孩子且左子树的右孩子等于右子树的左孩子,并 且左右子树节点的值相等,则是对称的。 public class Solution { boolean isSymmetrical(TreeNode pRoot) ...原创 2019-05-04 16:08:18 · 137 阅读 · 0 评论 -
58、二叉树的下一个节点
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。 思路:若节点右孩子存在,则设置一个指针从该节点的右孩子出发,一直沿着指向左子结点的指针找到的叶子 节点即为下一个节点;若节点不是根节点。如果该节点是其父节点的左孩子,则返回父节点;否则继续向上遍 历其父节点的父节点,重复之前的判断,返回结果 public...原创 2019-05-04 16:02:07 · 119 阅读 · 0 评论 -
二叉树中和为某一值的路径
题目:输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶结点所经过的所有的结点形成一条路径。 如下图,输入二叉树和整数22,则打印出两条路径,第一条路径包含结点10,12,第二条路径包含的结点为10,5,7. 一般的数据结构和算法的教材都没有介绍树的路径,因此对大多数应聘者而言,这是一个新概念,也就很难一下子想出完整的解题思路。这个时候我们...转载 2019-04-21 22:05:12 · 78 阅读 · 0 评论 -
二叉搜索树的后序遍历
题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。 思路: 从头遍历数组,找到第一个比最后一个数(根节点)大的数,该树前部分是左子树,后半部分是右子树 判断右子树是否有比根节点小的树,有则false; 遍历左右子树 public class Solution { public b...原创 2019-04-21 17:36:00 · 85 阅读 · 0 评论 -
从上往下打印二叉树
问题:从上往下打印出二叉树的每个节点,同层节点从左至右打印。 思路: 定义两个队列,一个存放节点,一个存放节点值; 先将根节点加入队列 ,再将根节点值加入另外一个队列; 在判断存根节点的队列,依次遍历,判断是否存在左右节点,节点加入一个队列,值加入另一个队列 返回存放值的队列 import java.util.ArrayList; /** public class TreeNode ...原创 2019-04-21 16:38:05 · 71 阅读 · 0 评论 -
026-二叉搜索树与双向链表
思路:中序遍历 双向链表连接 public class Solution { private TreeNode head=null; private TreeNode tail=null; public TreeNode Convert(TreeNode pRootOfTree) { visit(pRootOfTree); ret...原创 2019-05-12 10:24:11 · 86 阅读 · 0 评论