LeetCode 94、144、145 中序、前序、后序遍历的递归算法和非递归算法

在Java中list既可以实现栈,也可以实现队列。后序遍历的非递归算法,是难一点儿。

前序遍历:

递归算法:

public class LC144Try1
{
	public List<Integer> preorderTraversal(TreeNode root)
	{
		List<Integer> arr=new ArrayList<Integer>();
		prePass(root,arr);
		return arr;

	}
	public void prePass(TreeNode root,List<Integer> arr){
		if(root==null){
			return;
		}
		arr.add(root.val);
		prePass(root.left,arr);
		prePass(root.right,arr);
		
	}

}


非递归算法:

package test;

import java.util.ArrayList;
import java.util.List;

//非递归算法
public class LC144Try2
{
	public List<Integer> preorderTraversal(TreeNode root)
	{
		List<Integer> arr = new ArrayList<Integer>();
		List<TreeNode> list= new ArrayList<TreeNode>();
		TreeNode p=root;
		while(p!=null || list.size()>0){			
			if(p!=null){
				arr.add(p.val);
				list.add(p);				
				p=p.left;
			}else{							
				p=list.remove(list.size()-1);
				p=p.right;
			}			
			
		}
		
		return arr;
	}
	public static void main(String[] args)
	{
		LC144Try2 t = new LC144Try2();
		TreeNode root= new TreeNode(1);
		TreeNode r1= new TreeNode(2);
		TreeNode r2= new TreeNode(3);
		root.right=r1;
		r1.right=r2;
		System.out.println(t.preorderTraversal(root));
		
	}

}

 

中序遍历

递归算法:

package test;

import java.util.ArrayList;
import java.util.List;
class TreeNode {
	      int val;
	      TreeNode left;
	      TreeNode right;
	      TreeNode(int x) { val = x; }
	  }
//递归	 
public class LC94Try1
{
	public List<Integer> inorderTraversal(TreeNode root) {
		 List<Integer> arr = new ArrayList<Integer>();
		 inorderPass(root,arr);
		 return arr;
	}
	public void  inorderPass(TreeNode root,List<Integer> arr){
		if(root==null){
			return;
		}
		inorderPass(root.left,arr);
		arr.add(root.val);
		inorderPass(root.right,arr);
	}

}

非递归算法:

class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> ret = new ArrayList<Integer>();
        List<TreeNode> list= new ArrayList<TreeNode>();
        TreeNode p=root;
        while(p!=null || list.size()>0){
            if(p==null){
                p=list.remove(list.size()-1);
                ret.add(p.val);
                p=p.right;
            }else{
                list.add(p);
                p=p.left;
            }           

        }
        return ret;

    }
}


 

public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> ret =new ArrayList<>();
        Deque<TreeNode> stack= new LinkedList<>();
        TreeNode p=root;
        while(p!=null || stack.size()>0){
            if(p==null){
               p=stack.pop();
               ret.add(p.val);
               p=p.right;
            }else{
                stack.push(p);
                p=p.left;
            }

        }
        return ret;

    }

 

package test;

import java.util.ArrayList;
import java.util.List;

//非递归
public class LC94Try2
{
	public List<Integer> inorderTraversal(TreeNode root)
	{
		List<Integer> arr = new ArrayList<Integer>();
		List<TreeNode> list = new ArrayList<TreeNode>();
		TreeNode p = root;
		while (p != null || list.size() > 0)
		{
			if (p != null)
			{
				list.add(p);
				p = p.left;

			}else{
				p=list.remove(list.size()-1);
				arr.add(p.val);
				p=p.right;
			}
		}
		return arr;
	}

}

后序遍历:

递归算法:
 

package test;

import java.util.ArrayList;
import java.util.List;

public class LC145Try1
{
	public List<Integer> postorderTraversal(TreeNode root)
	{
		List<Integer> arr = new ArrayList<Integer>();
		postorderPass(root,arr);
		return arr;
	}
	public void postorderPass(TreeNode root,List<Integer> arr){
		if(root==null){
			return;
		}else{
			postorderPass(root.left,arr);
			postorderPass(root.right,arr);
			arr.add(root.val);
		}
	}

}

非递归算法:
 

package test;

import java.util.ArrayList;
import java.util.List;

public class LC145Try2
{
	public List<Integer> postorderTraversal(TreeNode root)
	{
		List<Integer> arr = new ArrayList<Integer>();
		List<TreeNode> list = new ArrayList<TreeNode>();
		TreeNode p = root;
		TreeNode r = root;//上一次输出读取的位置
		while(p!=null || list.size()>0){
			if(p!=null){
				list.add(p);
				p=p.left;
			}else{
				p=list.get(list.size()-1);
				if(p.right!=null && p.right!=r){
					p=p.right;
				}else{
					r=p;
					arr.add(p.val);
					list.remove(list.size()-1);					
					p=null;
				}
			}
		}
		return arr;
	}

}

哈哈

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值