![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
数据结构 :二叉树
剑指offer中二叉树的相关问题
Stephen.zhou
这个作者很懒,什么都没留下…
展开
-
二叉树层序遍历(正向)和 Z 字形遍历
二叉树节点struct TreeNode { int val; TreeNode* left; TreeNode* right; TreeNode(); TreeNode(int input) : val(input), left(nullptr), right(nullptr) {}};一、二叉树正向层序遍历//二叉树层序遍历void sequence(TreeNode *root) { TreeNode *cur; queue<TreeNode *> queue_1原创 2021-04-15 17:17:46 · 486 阅读 · 0 评论 -
二叉树递归非递归实现三大遍历
c++实现二叉树节点struct TreeNode { int val; TreeNode* left; TreeNode* right; TreeNode(); TreeNode(int input) : val(input), left(nullptr), right(nullptr) {}};一、递归实现二叉树三大遍历://递归实现三种遍历void preOrderRecur(TreeNode *root) { if (root != nullptr) { cout &原创 2021-04-15 16:49:15 · 127 阅读 · 0 评论 -
剑指offer (62)
题目 : 给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。思路 : 二叉搜索树的中序遍历就是从小到大排序,所以只要找到中序遍历的第K个节点即可;可以使用链表存储节点,要注意边界条件,K可能不是个有效值import java.util.ArrayList;import java.util.Arrays;pu...原创 2020-02-08 09:39:30 · 131 阅读 · 0 评论 -
剑指offer (61)
题目 : 请实现两个函数,分别用来序列化和反序列化二叉树二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。二叉树的反序列化是指:根据某种遍历顺序得...原创 2020-02-08 09:33:43 · 80 阅读 · 0 评论 -
剑指offer (60)
题目 :从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。思路 : 树的的广度优先遍历 法二与上题的不同在于,将两个栈变为两个队列,即实现了不同的共能,当然,在具体偶数层的时候也是不一样,前一题是变为先入右子树,再入左子树,这题则无需改变 public static ArrayList<ArrayList<Integer>> print(TreeNod...原创 2020-02-08 09:29:21 · 80 阅读 · 0 评论 -
剑指offer (59)
题目 : 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。思路 : 1.使用两个栈S1和S2存储奇数层和偶数层节点2.奇数层从左到右push进左右子树(出队时就可以是先右后左了)3.偶数层从右到左push进左右子树(出队时就可以是先左后右) public static ArrayList<...原创 2020-02-08 09:26:29 · 65 阅读 · 0 评论 -
剑指offer (57)
题目 : 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。思路 :(1)若该节点存在右子树:则下一个节点为右子树最左子节点(如图节点B)(2)若该节点不存在右子树:这时分两种情况:case1,该节点为父节点的左子节点,则下一个节点为其父节点(如图节点D)case2,该节点为父节点的右子节点,则沿着父节点...原创 2020-02-08 09:21:43 · 86 阅读 · 0 评论 -
剑指offer (39)
题目 : 输入一棵二叉树,判断该二叉树是否是平衡二叉树。思路 : 从下往下遍历,如果子树是平衡二叉树,则返回子树的高度;如果发现子树不是平衡二叉树,则直接停止遍历,这样至多对没个节点访问一次 public boolean isBalance_Solution(TreeNode root) { return getDepth(root) != -1; } public int get...原创 2020-02-07 21:14:05 · 60 阅读 · 0 评论 -
剑指offer (38)
题目 : 输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。思路 : 递归写法,比较简单public class Solution { public int treeDepth(TreeNode root) { if (root == null) { return 0; } int left = tree...原创 2020-02-07 21:09:30 · 102 阅读 · 0 评论 -
剑指offer (26)
题目 : 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。思路 : 直接用中序遍历,加一辅助节点head ,将原来的左节点 向右指,形成双向链表public class Solution { TreeNode head = null; TreeNode realhead = null; public TreeNode co...原创 2020-02-06 20:45:45 · 86 阅读 · 0 评论 -
剑指offer (24)
题目 : 输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)思路 : 此题简单 ,看代码注释import java.util.ArrayList;public class Solution { // 存储计算结果 ArrayList<...原创 2020-02-06 19:16:20 · 80 阅读 · 0 评论 -
剑指offer (23)
题目 : 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。思路 :采用分治法的思想,找到根结点、左子树的序列、右子树的序列,分别判断左右子序列是否为二叉树的后序序列。由题意可得:后序遍历序列的最后一个元素为二叉树的根节点;二叉搜索树左子树上所有的结点均小于根结点、右子树所有的结点均大于根结点。算...原创 2020-02-06 19:13:23 · 80 阅读 · 0 评论 -
剑指offer (22)
题目 :从上往下打印出二叉树的每个节点,同层节点从左至右打印。思路 : 二叉树的广度遍历 public static ArrayList<Integer> printFromToBottom (TreeNode root){ ArrayList<Integer> list = new ArrayList<>(); ArrayList<Tree...原创 2020-02-06 19:08:56 · 77 阅读 · 0 评论 -
剑指offer (18)
题目 :操作给定的二叉树,将其变换为源二叉树的镜像。思路 : 此题简单 ,不做过多赘述 public void mirror (TreeNode root) { if (root == null) { return; } else { TreeNode node = root.left; root.left = root.right; root.right...原创 2020-02-06 16:51:16 · 56 阅读 · 0 评论 -
剑指offer (17)
题目 : 输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)思路 :思路:对A树DFS,如果B的根节点与A中某个节点值相同,那么以B为树根进行DFS,判断即可时间复杂度为O(n * m) //判断树2是否是树1的子树,约定:空树不是任何树的子结构 public boolean hasSubtree (TreeNode root1,TreeNod...原创 2020-02-06 16:45:27 · 77 阅读 · 0 评论 -
剑指offer (4)
题目 : 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。思路 :因为是树的结构,一般都是用递归来实现。用数学归纳法的思想就是,假设最后一步,就是root的左右子树都已经重建好了,那么我只要考虑将root的左...原创 2020-02-06 10:34:38 · 89 阅读 · 0 评论