二叉树的中序遍历、先序遍历、后续遍历 Java实现——递归+迭代

  • 遍历的结果存储在一个 List
  • 以下代码的二叉树定义如下:
//二叉树的定义
		 public class TreeNode {
		      int val;
		      TreeNode left;
		      TreeNode right;
		      TreeNode() {}
		      TreeNode(int val) { this.val = val; }
		      TreeNode(int val, TreeNode left, TreeNode right) {
		          this.val = val;
		          this.left = left;
		          this.right = right;
		      }
		  }

中序遍历

递归(中序)

public List<Integer> inOrderTraversal(TreeNode root) {
			    List<Integer> res=new ArrayList<>();
			    inOrder(root,res);
			    return res;
			   }
		 public void inOrder(TreeNode root,List<Integer> res) {
			 if(root==null) return;
			 inOrder(root.left,res);//递归遍历左子树
			 res.add(root.val);//遍历该节点
			 inOrder(root.right,res);//递归遍历右子树
		 }

迭代(中序)

public class Solution {	 
		 public List<Integer> inOrderTraversal(TreeNode root) {
			    List<Integer> res=new ArrayList<>();
			    Deque<TreeNode> stk=new LinkedList<TreeNode>();
			    while(root!=null||!stk.isEmpty()) {
		    		while(root!=null) {
		    			stk.push(root);
		    			root=root.left;
		    		}
		    		root=stk.pop();
		    		res.add(root.val);
		    		root=root.right;
		    	}
			    return res;
			   }	
}

先序遍历

递归(先序)

public List<Integer> preOrderTraversal(TreeNode root) {
			    List<Integer> res=new ArrayList<>();
			    preorder(root,res);
			    return res;
			   }
		 public void preOrder(TreeNode root,List<Integer> res) {
			 if(root==null) return;
			 res.add(root.val);
			 preOrder(root.left,res);
			 preOrder(root.right,res);
		 }

迭代(先序)

     public List<Integer> preOrderTraversal(TreeNode root) {
        List<Integer> res=new ArrayList<>();
        Deque<TreeNode> stk=new LinkedList<>();
        while(root!=null||!stk.isEmpty()) {
            while(root!=null) {
                res.add(root.val);
                stk.push(root);
                root=root.left;
            }
            root=stk.pop();
            root=root.right;
        }
        return res;
        }

后序遍历

递归(后序)

public List<Integer> postOrderTraversal(TreeNode root) {
			    List<Integer> res=new ArrayList<>();
			    postOrder(root,res);
			    return res;
			   }
		 public void postOrder(TreeNode root,List<Integer> res) {
			 if(root==null) return;
			 postOrder(root.left,res);
			 postOrder(root.right,res);
			 res.add(root.val);
		 }

迭代(后序)

     public List<Integer> postOrderTraversal(TreeNode root) {
       List<Integer> res=new ArrayList<>();
			    Deque<TreeNode> stk=new LinkedList<>();
			    TreeNode isVisited = null;
			    while(root != null || !stk.isEmpty()){
			        while(root != null){
			            stk.push(root);
			            root =root.left;
			        }
			        root=stk.pop();
			        if(root.right == null || root.right==isVisited){
			            res.add(root.val);
			            isVisited = root;
			            root = null;
			        }else{
			            stk.push(root);
			            root = root.right;
			        }
			    } 
			    return res;
        }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值