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

1.前序

递归

 

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

迭代

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

 

	public List preorderTraversal(TreeNode root) {
		List result=new ArrayList();
		Stack 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 preorderTraversal(TreeNode root) {
        List list=new ArrayList();
        Stack 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 inorderTraversal(TreeNode root) {
        List list=new ArrayList();
        if(root!=null){
            list.addAll(inorderTraversal(root.left));
            list.add(root.val);
            list.addAll(inorderTraversal(root.right));
        }
        return list;
    }


迭代:

 

 

    public List inorderTraversal(TreeNode root) {
        List list=new ArrayList();
        Stack 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 postorderTraversal(TreeNode root) {
  List list=new ArrayList();
    if(root!=null){
      postorderTraversal(root.left);
      postorderTraversal(root.right);
      list.add(root.val);  
    }
     return list;
 }


迭代:

 

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

1.此节点是叶子节点。

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

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

 

public List postOrderTrace(Tree root) {
		List list = new ArrayList();
		Stack 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 postorderTraversal(TreeNode root) {
        List list=new ArrayList();
        if(root==null)
            return list;
        Stack 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;
    }

 

 

 

 

 

 

 

你可能感兴趣的:(leetcode,数据结构与算法)