---恢复内容开始---

19. 删除链表的倒数第N个节点

实现原理:设置两个指针p,q,初始时先让p走n步,之后p与q一起走,当p走到结尾的时候,删除p.next即可。

  1. public ListNode removeNthFromEnd2(ListNode head, int n) {
  2.  
  3. ListNode dummy=new ListNode(-1);
  4. dummy.next=head;
  5. ListNode p=dummy;
  6. ListNode q=dummy;
  7.  
  8. // 先让qp先走n步
  9. for(int i=0;i<n;i++){
  10. p=p.next;
  11. }
  12. // 之后一起走
  13. while(p.next!=null){
  14. p=p.next;
  15. q=q.next;
  16. }
  17. q.next=q.next.next;
  18.  
  19. return dummy.next;
  20. }

 

二叉树遍历:

递归方式遍历:

  1. public void Order(TreeNode root){
  2. if(root==null) return ;
  3.  
  4. // 先序
  5. System.out.println(root.val);
  6. Order(root.left);
  7. Order(root.right);
  8.  
  9. // 中序
  10. Order(root.left);
  11. System.out.println(root.val);
  12. Order(root.right);
  13.  
  14. // 后序
  15. Order(root.left);
  16. Order(root.right);
  17. System.out.println(root.val);
  18.  
  19. }

非递归版本:

先序遍历:

  1. // 先序遍历
  2. // 实现原理:创建一个栈空间,每次进行访问的时候都是同样的压入进栈,直到节点的左孩子为空的时候,将其出栈,方向转到其右孩子上面
  3.  
  4. public List<Integer> preorderTraversal(TreeNode root) {
  5. if(root==null) return null;
  6. List<Integer> result=new ArrayList<Integer>();
  7. Stack<TreeNode> s=new Stack<>();
  8.  
  9. while(!s.isEmpty() || root!=null){
  10. while(root!=null){
  11. result.add(root.val);
  12. s.push(root);
  13. root=root.left;
  14. }
  15.  
  16. if(!s.isEmpty()){
  17. root=s.pop();
  18. root=root.right;
  19. }
  20. }
  21. return result;
  22.  
  23. }

中序遍历:

  1. // 中序遍历
  2. public List<Integer> inorderTraversal(TreeNode root) {
  3. // 实现策略跟先序类似,只是压入进栈的时间问题
  4.  
  5. List<Integer> result=new ArrayList<>();
  6. Stack<TreeNode> s=new Stack<>();
  7.  
  8. while(!s.isEmpty()||root!=null){
  9. while(root!=null){
  10. s.push(root);
  11. root=root.left;
  12. }
  13.  
  14. if(!s.isEmpty()){
  15. root=s.pop();
  16. result.add(root.val);
  17. root=root.right;
  18. }
  19. }
  20. return result;
  21. }

后序遍历:

实现原理:
* 需要保证根节点在左孩子和右孩子都被访问之后才能访问,有几个临界条件:
* 对于任意的一个节点P,先将其入栈,如果p不存在左右孩子,则可以直接访问;
* 或者其存在左孩子或者右孩子,但是其左孩子和右孩子都已经被访问过了,则同样可以进行直接访问该节点。
* 若非上述情况,则需要将其右左孩子依次入栈,这样就保证了在访问的时候,左孩子在右孩子的前面,
* 左孩子和右孩子都在根节点的前面被访问。

  1. public List<Integer> postorderTraversal2(TreeNode root){
  2.  
  3. List<Integer> result=new ArrayList<>();
  4. Stack<TreeNode> s=new Stack<>();
  5. //注意返回的数据类型
  6. if(root==null){
  7. return result;
  8. }
  9.  
  10. TreeNode cur;
  11. TreeNode prev=null;
  12.  
  13. s.push(root);
  14. while(!s.isEmpty()){
  15. cur=s.peek();
  16. if((cur.left==null && cur.right==null) ||
  17. (prev!=null &&(prev==cur.left ||prev==cur.right ))){
  18. result.add(cur.val);
  19. s.pop();
  20. prev=cur;
  21. }
  22. else{
  23. if(cur.right!=null){
  24. s.push(cur.right);
  25. }
  26. if(cur.left!=null){
  27. s.push(cur.left);
  28. }
  29. }
  30. }
  31. return result;
  32. }

  

LeetCode 链表2_27+二叉树的遍历(递归与非递归)的更多相关文章

  1. 二叉树3种递归和非递归遍历(Java)

    import java.util.Stack; //二叉树3种递归和非递归遍历(Java) public class Traverse { /******************一二进制树的定义*** ...

  2. 数据结构二叉树的递归与非递归遍历之java,javascript,php实现可编译(1)java

    前一段时间,学习数据结构的各种算法,概念不难理解,只是被C++的指针给弄的犯糊涂,于是用java,web,javascript,分别去实现数据结构的各种算法. 二叉树的遍历,本分享只是以二叉树中的先序 ...

  3. C实现二叉树(模块化集成,遍历的递归与非递归实现)

    C实现二叉树模块化集成 实验源码介绍(源代码的总体介绍):header.h : 头文件链栈,循环队列,二叉树的结构声明和相关函数的声明.LinkStack.c : 链栈的相关操作函数定义.Queue. ...

  4. JAVA递归、非递归遍历二叉树(转)

    原文链接: JAVA递归.非递归遍历二叉树 import java.util.Stack; import java.util.HashMap; public class BinTree { priva ...

  5. 二叉树前中后/层次遍历的递归与非递归形式(c++)

    /* 二叉树前中后/层次遍历的递归与非递归形式 */ //*************** void preOrder1(BinaryTreeNode* pRoot) { if(pRoot==NULL) ...

  6. Java实现二叉树的先序、中序、后序、层序遍历(递归和非递归)

    二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的.对于二叉树,有前序.中序以及后序三种遍历方法.因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易 ...

  7. Java - 二叉树递归与非递归

    树的定义具有递归特性,因此用递归来遍历比较符合特性,但是用非递归方式就比较麻烦,主要是递归和栈的转换. import java.util.Stack; /** * @author 李文浩 * @ver ...

  8. 数据结构-树以及深度、广度优先遍历(递归和非递归,python实现)

    前面我们介绍了队列.堆栈.链表,你亲自动手实践了吗?今天我们来到了树的部分,树在数据结构中是非常重要的一部分,树的应用有很多很多,树的种类也有很多很多,今天我们就先来创建一个普通的树.其他各种各样的树 ...

  9. 数据结构作业——图的存储及遍历(邻接矩阵、邻接表+DFS递归、非递归+BFS)

    邻接矩阵存图 /* * @Author: WZY * @School: HPU * @Date: 2018-11-02 18:35:27 * @Last Modified by: WZY * @Las ...

随机推荐

  1. Python基础之元组和字典

    一.元组: 1.定义: 内存图: 2.基本操作 3.元组作用: 4.元组基础知识代码 # . 创建空元组 t01 = () t02 = tuple() # . 创建具有默认值的元组 t01 = (,, ...

  2. linux中启动 java -jar 后台运行程序

    直接用java -jar xxx.jar,当退出或关闭shell时,程序就会停止掉.以下方法可让jar运行后一直在后台运行. 1. java -jar xxx.jar & 说明: 在末尾加入 ...

  3. linux基础命令--groupdel 删除群组

    描述 groupdel命令用于删除用户组. groupdel命令会去修改系统下的/etc/group和/group/gshadow文件,删除有关用户组的所有项目(一般来说使用groupadd或user ...

  4. less的使用(好文章)

    好文章链接:30分钟学会less 自己总结一下这篇文章中的几个关键字:变量.混合.函数.嵌套.@import 下面贴上自己照着上面写的一些代码: <template> <div cl ...

  5. 【Solution】API测试工具,访问方式

    1. post的时候,@requestBody 用 json的传递方式

  6. C++ MFC万能的类向导

    MFC的类向导 只要你掌握了类向导,你基本就已经掌握了MFC了,毕竟布局和代码都是自动生成,再加上C++基础上手还是挺快的,剩下的就是多多练习了. 转自: https://blog.csdn.net/ ...

  7. Windows使用tail命令跟踪日志

    我们知道如果是Unix/Linux环境可以直接使用 tail -f xxx.log即可. 但是Windows并没有自带这个命令,不过从网上可以找到tail.zip 实测可以将其解压放在C:\Windo ...

  8. java支付宝接口开发

    在线支付接入支付宝,首先需要去官网申请开发者账号,具体步骤如下: 一.打开官网 1.直接打开链接https://open.alipay.com/platform/home.htm进入 2.百度搜索蚂蚁 ...

  9. Kafka笔记6(数据传递的可靠性)

    Kafka保证分区消息的顺序,“先入先出” 只有当消息被写入分区的所有副本时,才被认为已提交的 只要有一个副本是活跃的,已提交的消息就不会丢失 消费者只能读取已经提交的消息 如果一个或多个副本在同步/ ...

  10. 对int类型的数据,如何让获取长度

    下面为大家写一个列子   int a = 124;<br> Integer a1 = a;//转换为包装类Integer<br> System.out.println(a1.t ...