给定一个二叉树,求二叉树的前序 中序 后序遍历 使用递归和迭代算法,看这一篇就够了

递归算法

**二叉树节点的定义。**

 public class TreeNode {
     int val;
     TreeNode left;
    TreeNode right;
     TreeNode(int x) { val = x; }
 }

前序递归:

    public static void preOrder(TreeNode tree) {
        if (tree == null)
            return;
        System.out.printf(tree.val + "");
        preOrder(tree.left);
        preOrder(tree.right);
    }

中序递归:

    public static void inOrderTraversal(TreeNode node) {
        if (node == null)
            return;
        inOrderTraversal(node.left);
        System.out.println(node.val);
        inOrderTraversal(node.right);
    }

后序递归:

public void postOrder(TreeNode tree) {
        if (tree == null)
            return;
        postOrder(tree.left);
        postOrder(tree.right);
        System.out.println(tree.val);
        }

迭代算法

**二叉树节点的定义。**

 public class TreeNode {
     int val;
     TreeNode left;
    TreeNode right;
     TreeNode(int x) { val = x; }
 }

前序递归:

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

中序递归:

class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<Integer>();
	    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;   
    }   
}

后序递归:(***重点)

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

简单对比,递归真是个好算法,不过其它解法也很有特色。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值