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 ...
随机推荐
- Python基础之元组和字典
一.元组: 1.定义: 内存图: 2.基本操作 3.元组作用: 4.元组基础知识代码 # . 创建空元组 t01 = () t02 = tuple() # . 创建具有默认值的元组 t01 = (,, ...
- linux中启动 java -jar 后台运行程序
直接用java -jar xxx.jar,当退出或关闭shell时,程序就会停止掉.以下方法可让jar运行后一直在后台运行. 1. java -jar xxx.jar & 说明: 在末尾加入 ...
- linux基础命令--groupdel 删除群组
描述 groupdel命令用于删除用户组. groupdel命令会去修改系统下的/etc/group和/group/gshadow文件,删除有关用户组的所有项目(一般来说使用groupadd或user ...
- less的使用(好文章)
好文章链接:30分钟学会less 自己总结一下这篇文章中的几个关键字:变量.混合.函数.嵌套.@import 下面贴上自己照着上面写的一些代码: <template> <div cl ...
- 【Solution】API测试工具,访问方式
1. post的时候,@requestBody 用 json的传递方式
- C++ MFC万能的类向导
MFC的类向导 只要你掌握了类向导,你基本就已经掌握了MFC了,毕竟布局和代码都是自动生成,再加上C++基础上手还是挺快的,剩下的就是多多练习了. 转自: https://blog.csdn.net/ ...
- Windows使用tail命令跟踪日志
我们知道如果是Unix/Linux环境可以直接使用 tail -f xxx.log即可. 但是Windows并没有自带这个命令,不过从网上可以找到tail.zip 实测可以将其解压放在C:\Windo ...
- java支付宝接口开发
在线支付接入支付宝,首先需要去官网申请开发者账号,具体步骤如下: 一.打开官网 1.直接打开链接https://open.alipay.com/platform/home.htm进入 2.百度搜索蚂蚁 ...
- Kafka笔记6(数据传递的可靠性)
Kafka保证分区消息的顺序,“先入先出” 只有当消息被写入分区的所有副本时,才被认为已提交的 只要有一个副本是活跃的,已提交的消息就不会丢失 消费者只能读取已经提交的消息 如果一个或多个副本在同步/ ...
- 对int类型的数据,如何让获取长度
下面为大家写一个列子 int a = 124;<br> Integer a1 = a;//转换为包装类Integer<br> System.out.println(a1.t ...