LeetCode 链表2_27+二叉树的遍历(递归与非递归)
---恢复内容开始---
19. 删除链表的倒数第N个节点
实现原理:设置两个指针p,q,初始时先让p走n步,之后p与q一起走,当p走到结尾的时候,删除p.next即可。
public ListNode removeNthFromEnd2(ListNode head, int n) {
ListNode dummy=new ListNode(-1);
dummy.next=head;
ListNode p=dummy;
ListNode q=dummy;
// 先让qp先走n步
for(int i=0;i<n;i++){
p=p.next;
}
// 之后一起走
while(p.next!=null){
p=p.next;
q=q.next;
}
q.next=q.next.next;
return dummy.next;
}
二叉树遍历:
递归方式遍历:
public void Order(TreeNode root){
if(root==null) return ;
// 先序
System.out.println(root.val);
Order(root.left);
Order(root.right);
// 中序
Order(root.left);
System.out.println(root.val);
Order(root.right);
// 后序
Order(root.left);
Order(root.right);
System.out.println(root.val);
}
非递归版本:
先序遍历:
// 先序遍历
// 实现原理:创建一个栈空间,每次进行访问的时候都是同样的压入进栈,直到节点的左孩子为空的时候,将其出栈,方向转到其右孩子上面 public List<Integer> preorderTraversal(TreeNode root) {
if(root==null) return null;
List<Integer> result=new ArrayList<Integer>();
Stack<TreeNode> s=new Stack<>(); while(!s.isEmpty() || root!=null){
while(root!=null){
result.add(root.val);
s.push(root);
root=root.left;
} if(!s.isEmpty()){
root=s.pop();
root=root.right;
}
}
return result; }
中序遍历:
// 中序遍历
public List<Integer> inorderTraversal(TreeNode root) {
// 实现策略跟先序类似,只是压入进栈的时间问题 List<Integer> result=new ArrayList<>();
Stack<TreeNode> s=new Stack<>(); while(!s.isEmpty()||root!=null){
while(root!=null){
s.push(root);
root=root.left;
} if(!s.isEmpty()){
root=s.pop();
result.add(root.val);
root=root.right;
}
}
return result;
}
后序遍历:
实现原理:
* 需要保证根节点在左孩子和右孩子都被访问之后才能访问,有几个临界条件:
* 对于任意的一个节点P,先将其入栈,如果p不存在左右孩子,则可以直接访问;
* 或者其存在左孩子或者右孩子,但是其左孩子和右孩子都已经被访问过了,则同样可以进行直接访问该节点。
* 若非上述情况,则需要将其右左孩子依次入栈,这样就保证了在访问的时候,左孩子在右孩子的前面,
* 左孩子和右孩子都在根节点的前面被访问。
public List<Integer> postorderTraversal2(TreeNode root){
List<Integer> result=new ArrayList<>();
Stack<TreeNode> s=new Stack<>();
//注意返回的数据类型
if(root==null){
return result;
}
TreeNode cur;
TreeNode prev=null;
s.push(root);
while(!s.isEmpty()){
cur=s.peek();
if((cur.left==null && cur.right==null) ||
(prev!=null &&(prev==cur.left ||prev==cur.right ))){
result.add(cur.val);
s.pop();
prev=cur;
}
else{
if(cur.right!=null){
s.push(cur.right);
}
if(cur.left!=null){
s.push(cur.left);
}
}
}
return result;
}
LeetCode 链表2_27+二叉树的遍历(递归与非递归)的更多相关文章
- 二叉树3种递归和非递归遍历(Java)
import java.util.Stack; //二叉树3种递归和非递归遍历(Java) public class Traverse { /******************一二进制树的定义*** ...
- 数据结构二叉树的递归与非递归遍历之java,javascript,php实现可编译(1)java
前一段时间,学习数据结构的各种算法,概念不难理解,只是被C++的指针给弄的犯糊涂,于是用java,web,javascript,分别去实现数据结构的各种算法. 二叉树的遍历,本分享只是以二叉树中的先序 ...
- C实现二叉树(模块化集成,遍历的递归与非递归实现)
C实现二叉树模块化集成 实验源码介绍(源代码的总体介绍):header.h : 头文件链栈,循环队列,二叉树的结构声明和相关函数的声明.LinkStack.c : 链栈的相关操作函数定义.Queue. ...
- JAVA递归、非递归遍历二叉树(转)
原文链接: JAVA递归.非递归遍历二叉树 import java.util.Stack; import java.util.HashMap; public class BinTree { priva ...
- 二叉树前中后/层次遍历的递归与非递归形式(c++)
/* 二叉树前中后/层次遍历的递归与非递归形式 */ //*************** void preOrder1(BinaryTreeNode* pRoot) { if(pRoot==NULL) ...
- Java实现二叉树的先序、中序、后序、层序遍历(递归和非递归)
二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的.对于二叉树,有前序.中序以及后序三种遍历方法.因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易 ...
- Java - 二叉树递归与非递归
树的定义具有递归特性,因此用递归来遍历比较符合特性,但是用非递归方式就比较麻烦,主要是递归和栈的转换. import java.util.Stack; /** * @author 李文浩 * @ver ...
- 数据结构-树以及深度、广度优先遍历(递归和非递归,python实现)
前面我们介绍了队列.堆栈.链表,你亲自动手实践了吗?今天我们来到了树的部分,树在数据结构中是非常重要的一部分,树的应用有很多很多,树的种类也有很多很多,今天我们就先来创建一个普通的树.其他各种各样的树 ...
- 数据结构作业——图的存储及遍历(邻接矩阵、邻接表+DFS递归、非递归+BFS)
邻接矩阵存图 /* * @Author: WZY * @School: HPU * @Date: 2018-11-02 18:35:27 * @Last Modified by: WZY * @Las ...
随机推荐
- 执行发送邮件Send方法时,报错:邮箱不可用。 服务器响应为: 5.7.1 Unable to relay for xxx@xxx.com
.net代码在执行发送邮件Send方法时,往往出现这个的报错: 邮箱不可用. 服务器响应为: 5.7.1 Unable to relay for xxx@xxx.com 这个问题应该是smtp的设置问 ...
- Nginx负载均衡后端健康检查(支持HTTP和TCP)
之前有一篇文章记录nginx负载均衡后端检查,链接为 https://www.cnblogs.com/minseo/p/9511456.html 但是只包含http健康检查不包含tcp下面安装ngin ...
- Thymeleaf常用th标签
https://www.jianshu.com/p/f9ebd23e8da4 关键字 功能介绍 案例 th:id 替换id <input th:id="'xxx' + ${collec ...
- LeetCode 96 - 不同的二叉搜索树 - [DP]
假定 $f[n]$ 表示有 $n$ 个节点的二叉树,有多少种不同结构. 因此 $f[n] = \sum_{i=0}^{n-1} (f[i] \times f[n-1-i])$,选一个节点作为根节点,那 ...
- Spring的核心模块解析
Spring框架是一个轻量级的集成式开发框架,可以和任何一种框架集成在一起使用,可以说是一个大的全家桶.Spring从1.x发展到现在的5.x可以说是越来越强大,下面来看看Spring都包含哪些核心的 ...
- [Java]直播方案----[接入环信聊天室]+[腾讯云直播]
辛辛苦苦写的,转载请注明一下,这点信任我想还是有的吧,谢谢了. http://www.cnblogs.com/applerosa/p/7162268.html 之前做了直播,一直没时间写,好不容易闲下 ...
- Spring AOP功能和目标
1.AOP的作用 在OOP中,正是这种分散在各处且与对象核心功能无关的代码(横切代码)的存在,使得模块复用难度增加.AOP则将封装好的对象剖开,找出其中对多个对象产生影响的公共行为,并将其封装为一个可 ...
- linux cp 拷贝文件或目录
cp 拷贝文件或目录 默认不能拷贝目录 常用来备份: [root@MongoDB ~]# cp a.txt /tmp/ [root@MongoDB ~]# cp /root/a.txt /tmp/ c ...
- group by分组后获得每组中符合条件的那条记录
当group by单独使用时,只显示出每组的第一条记录.如下,未分组时查询出两条记录 SELECT info.id, info.switch_id, info.port_id, info.mac_ad ...
- react创建项目很慢,最后提示fetch failed的解决方法
$ cnpm install -g create-react-app //创建react全局变量 $ create-react-app my-app //创建一个react项目 国内使用 npm 速度 ...