一、从上往下打印二叉树:

1、题目:

上往下打印出二叉树的每个节点,同层节点从左至右打印。

2、解题思路:

用arraylist模拟一个队列来存储相应的TreeNode。

3、代码实现:

public class Test9 {public ArrayList<Integer> PrintFromTopToBottom(TreeNode root) {ArrayList<Integer> list=new ArrayList<Integer>();if(root == null){return list;}ArrayList<TreeNode> queen=new ArrayList<TreeNode>();queen.add(root);while(queen.size()!=0){TreeNode temp=queen.remove(0);if(temp.left!=null){queen.add(temp.left);}if(temp.right!=null){queen.add(temp.right);}list.add(temp.val);}return list;}
}class TreeNode{int val = 0;TreeNode left = null;TreeNode right = null;public TreeNode(int val) {this.val = val;}
}

二、二叉搜索树的后序遍历:

1、题目:

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同

2、解题思路:

已知条件:后序序列最后一个值为root;二叉搜索树左子树值都比root小,右子树值都比root大。
(1)确定root;
(2)遍历序列(除去root结点),找到第一个大于root的位置,则该位置左边为左子树,右边为右子树;
(3)遍历右子树,若发现有小于root的值,则直接返回false;
(4)分别判断左子树和右子树是否仍是二叉搜索树(即递归步骤1、2、3)。

3、代码实现:

public class Test10 {public boolean VerifySquenceOfBST(int [] sequence) {if(sequence.length==0){return false;}if(sequence.length==1){return true;}return judge(sequence,0,sequence.length-1);}public boolean judge(int [] sequence,int startIndex,int rootIndex){if(startIndex>rootIndex){return true;}int i=startIndex;//找到右子树的第一个节点的下标while(sequence[i]<sequence[rootIndex]){i++;}for(int j=i;j<rootIndex;j++){if(sequence[j]<sequence[rootIndex]){return false;}}return judge(sequence,startIndex,i-1)&&judge(sequence,i,rootIndex-1);}
}

三、二叉树中和为某一值的路径:

1、题目

输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)。

2、解题思路:

(1)root入栈,跳入该子树进行寻路操作 ;
 (2)若root的这条路径,已满足要求,则将该路径加入到listAll中去;
 (3)对root左右子树,继续寻路;
 (4)root出栈,该子树访问完毕;

3、代码实现:

public class Test11 {private ArrayList<ArrayList<Integer>> resultList=new ArrayList<>();//最终返回的resultListprivate ArrayList<Integer> list= new ArrayList<>();public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) {find(root,target);//对resultList的进行按长度排序Collections.sort(resultList,new Comparator<ArrayList<Integer>>() {@Overridepublic int compare(ArrayList<Integer> o1, ArrayList<Integer> o2) {return o2.size()-o1.size();}});return resultList;}public void find(TreeNode root,int target){if(root==null){return ;}list.add(root.val);target=target-root.val;if(target==0 && root.left==null && root.right==null){resultList.add(new ArrayList<Integer>(list));}//如果提前超过target的值,则终止遍历,不继续查找子节点if(target<0){list.remove(list.size()-1);return ;}find(root.left,target);find(root.right,target);//回退list.remove(list.size()-1);}
}class TreeNode {int val = 0;TreeNode left = null;TreeNode right = null;public TreeNode(int val) {this.val = val;}
}

四、二叉树与双向链表:

1、题目:

输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。

2、解题思路:

代码中有注释。

3、代码实现:

public class Test13 {//第二种递归方式://改进步骤2://记录子树链表的最后一个节点,终结点只可能为只含左子树的非叶节点与叶节点protected TreeNode leftLast = null;public TreeNode Convert2(TreeNode pRootOfTree) {if(pRootOfTree == null){return null;}if(pRootOfTree.left == null && pRootOfTree.right == null){leftLast = pRootOfTree;return pRootOfTree;}//1、将左子树构造成双链表,并返回链表头结点。TreeNode left=Convert2(pRootOfTree.left);//3、如果左子树的链表不为空的话,将当前root追加到左子树链表if(left!=null){leftLast.right = pRootOfTree;pRootOfTree.left=leftLast;}leftLast = pRootOfTree;//当根节点只含左子树时,则该根节点为最后一个节点。//4、将右子树构造成双链表,并返回链表头结点TreeNode right= Convert2(pRootOfTree.right);//5、如果右子树链表不为空的话,将该链表追加到root节点if(right!=null){right.left=pRootOfTree;pRootOfTree.right=right;}return left!=null?left:pRootOfTree;}//第一种递归方式:public TreeNode Convert(TreeNode pRootOfTree) {if(pRootOfTree == null){return null;}if(pRootOfTree.left == null && pRootOfTree.right == null){return pRootOfTree;}//1、将左子树构造成双链表,并返回链表头结点。TreeNode left=Convert(pRootOfTree.left);TreeNode p=left;//2、定位至左子树双链表最后一个节点while(p!=null && p.right!=null){p=p.right;}//3、如果左子树的链表不为空的话,将当前root追加到左子树链表if(left!=null){p.right = pRootOfTree;pRootOfTree.left=p;}//4、将右子树构造成双链表,并返回链表头结点TreeNode right= Convert(pRootOfTree.right);//5、如果右子树链表不为空的话,将该链表追加到root节点if(right!=null){right.left=pRootOfTree;pRootOfTree.right=right;}return left!=null?left:pRootOfTree;}
}class TreeNode {int val = 0;TreeNode left = null;TreeNode right = null;public TreeNode(int val) {this.val = val;}
}

《剑指offer》-- 从上往下打印二叉树、二叉搜素树的后序遍历、二叉树中和为某一值的路径、二叉树与双向链表相关推荐

  1. C#刷剑指Offer | 从上到下打印二叉树

    [C#刷题]| 作者 / Edison Zhou 这是EdisonTalk的第288篇原创内容 我们来用之前学到的数据结构知识来刷<剑指Offer>的一些核心题目(精选了其中30+道题目) ...

  2. 剑指offer 从上往下打印二叉树

    题目描述 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 解决方案: import java.util.ArrayList; import java.util.ArrayList; impor ...

  3. 二叉树高度的代码解析_剑指offer 从上到下打印二叉树

    题目描述 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 解析:这实际上就是二叉树的层序遍历.规律如下:每次打印节点,如果该节点有子节点,则将子节点放入队列末尾,然后取出队列头部最早进入队列的 ...

  4. 剑指offer 从上到下打印二叉树

    思路:采用队列思想,一边进一边出,先进先出,选择双向队列deque(其实queue已经够了,没必要用deque) /* struct TreeNode {     int val;     struc ...

  5. [leetcode]剑指offer32-1.从上到下打印二叉树

    从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印. 例如: 给定二叉树: [3,9,20,null,null,15,7], 3 / 9 20 / 15 7 返回: [3,9,20,1 ...

  6. [剑指offer]面试题第[36]题[JAVA][二叉搜索树与双向链表][递归]

    [问题描述][中等] [解答思路] 中序遍历 时间复杂度:O(N) 空间复杂度:O(N) class Solution {Node pre, head;public Node treeToDoubly ...

  7. 剑指offer23 从上往下打印二叉树

    另一种写法,不用deque class Solution { public:vector<int> PrintFromTopToBottom(TreeNode* root) {vector ...

  8. [剑指offer]面试题第[54]题[JAVA][二叉搜索树的第k大节点][递归][迭代]

    [问题描述][简单] 给定一棵二叉搜索树,请找出其中第k大的节点.示例 1: 输入: root = [3,1,4,null,2], k = 13/ \1 4\2 输出: 4 示例 2:输入: root ...

  9. [剑指offer][JAVA]面试题第[33]题[二叉搜索树的后序遍历][单调栈][递归分治]

    [问题描述][中等] 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果.如果是则返回 true,否则返回 false.假设输入的数组的任意两个数字都互不相同.参考以下这颗二叉搜索树:5/ ...

最新文章

  1. 解释@Component @Controller @Service @Repository
  2. 利用nginx的fastcgi_cache模块来做缓存
  3. Spark读取普通RDD加载为DataFrame
  4. Nginx环境下PHP flush失效的解决方法
  5. .net core image怎么保存_C# 将PDF转为多种Image图像文件格式(Png/Bmp/Emf/Tiff)
  6. eclipse项目中关于导入的项目里提示HttpServletRequest 不能引用的解决办法
  7. 微众银行在联邦推荐算法上的探索及应用(文末附PPT下载链接)
  8. 89c52串口发送接收小示例
  9. MyBatis中foreach的用法
  10. 在线作诗,做诗机,一键生成藏头诗,藏头诗在线制作,藏头诗生成器, 姓名藏头诗,姓名作诗
  11. 第三章 分类模型-随机森林知识点详细总结
  12. web开发网页嵌入flash
  13. JupyterLab 的安装与使用
  14. PYNQ官方镜像配置
  15. matlab的循环结构
  16. 赛舟-体验版 α测试调试方法
  17. 紫雨老师接触自然法则的经过与故事
  18. 求1到100的质数,用python写
  19. c语言 typedef 函数,C语言的typedef
  20. 前端工程师必备收藏:学习资源全网罗

热门文章

  1. 三、深入elasticsearch基本语法
  2. AHP层次分析法解决用户价值评估
  3. php定义一个名为Vehicles,[PHP][Yii2.0] 以Yii 2.0风格加载自定义类或命名空间 [配置使用Yii2 autoloader]...
  4. 54万奖金+百度地图海量业务数据集,智能交通CV赛题来了
  5. 首个金融领域的开源中文预训练语言模型FinBERT了解下
  6. 实录 | DSTC 8“基于Schema的对话状态追踪”竞赛冠军方案解读
  7. web 小程序 ch4 小程序组件
  8. HDU 1853 HDU 3488【有向环最小权值覆盖问题 】带权二分图匹配 KM算法
  9. python中的异常处理 try..except
  10. python小波变换尺度函数_Python图像处理(17):pyWavelet