Java 二叉树的前序、中序、后续遍历 递归和迭代实现

1.前序

递归

 

    public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> list=new ArrayList<Integer>();
        if(root!=null){
        	list.add(root.val);
        	list.addAll(preorderTraversal(root.left));
        	list.addAll(preorderTraversal(root.right));
        }	
        return list;
    }

迭代

前序就是深度优先遍历,使用stack。

 

	public List<Integer> preorderTraversal(TreeNode root) {
		List<Integer> result=new ArrayList<Integer>();
		Stack<TreeNode> stack=new Stack<>();		
		if(root==null)
			return result;
		stack.push(root);
		while(!stack.isEmpty()){
			TreeNode pNode=stack.pop();			
			result.add(pNode.val);
			if(pNode.right!=null)
				stack.push(pNode.right);
			if(pNode.left!=null)
				stack.push(pNode.left);
		}
		return result;
	}

 

 

 

 

 

另一种写法

 

    public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> list=new ArrayList<Integer>();
        Stack<TreeNode> s=new Stack<>();
        TreeNode top=root;
        while(top!=null || !s.isEmpty()){
        	while(top!=null){
            	list.add(top.val);
        		s.push(top);
        		top=top.left;
        	}
        	top=s.pop();
        	top=top.right;
        }
        return list;
    }

 

 

 

 

 

2.中序

递归

 

    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> list=new ArrayList<Integer>();
        if(root!=null){
            list.addAll(inorderTraversal(root.left));
            list.add(root.val);
            list.addAll(inorderTraversal(root.right));
        }
        return list;
    }


迭代:

 

 

    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> list=new ArrayList<Integer>();
        Stack<TreeNode> s=new Stack<>();
        TreeNode top=root;
        while(top!=null || !s.isEmpty()){
        	while(top!=null){
        		s.push(top);
        		top=top.left;
        	}	
        	top=s.pop();
        	list.add(top.val);     
        	top=top.right;
        }
        return list;
    }

3.后序

 

递归:

 


  public List<Integer> postorderTraversal(TreeNode root) {
  List<Integer> list=new ArrayList<Integer>();
    if(root!=null){
      postorderTraversal(root.left);
      postorderTraversal(root.right);
      list.add(root.val);  
    }
     return list;
 }


迭代:

 

后序的迭代比较麻烦,输出的条件是

1.此节点是叶子节点。

2.此节点的叶子节点都已经输出

所以用一个pre节点保存上一次访问的节点。

 

public List<Integer> postOrderTrace(Tree root) {
		List<Integer> list = new ArrayList<Integer>();
		Stack<Tree> s = new Stack<>();
		Tree top = root;
		Tree pre=null;
		while (top != null || !s.isEmpty()) {
			while (top != null) {
				s.push(top);
				top = top.left;
			}
			top = s.peek();
			if (top.right != null && pre != top.right) {
				top = top.right;
			} else {
				top = s.pop();
				list.add(top.val);
				pre = top;
				top = null;
			}
			
		}
		return list;
	}

// 或者    
public List<Integer> postorderTraversal(TreeNode root) {
        List<Integer> list=new ArrayList<Integer>();
        if(root==null)
            return list;
        Stack<TreeNode> s=new Stack<>();
        s.push(root);
        TreeNode top,pre=null;
        while(!s.isEmpty()){
        	top=s.peek();
        	if((top.left==null && top.right==null ) || (pre!=null && (top.left==pre || top.right==pre))){
        		list.add(top.val);
        		s.pop();
        	}else{
        		if(top.right!=null){        		
        			s.push(top.right);
        		}	
        		if(top.left!=null){
        			s.push(top.left);
        		}	
        	}	        
        	pre=top;
        }
        return list;
    }

 

 

 

 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值