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;
	 }
	 

  

 

posted @ 2019-02-27 18:00  Qian1996  阅读(173)  评论(0编辑  收藏  举报