微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

二叉树迭代遍历法

1.迭代先序遍历

利用栈实现前序遍历的迭代

  1. 将root压入(push)栈
  2. 当栈不为空时进行迭代
    (1) cur为出栈元素(出栈的首先是根节点,再是左节点,最后是右节点)
    (2)当cur有右子树时先将右子树入栈,再将cur的左子树入栈
/**
 * DeFinition for a binary tree node.
 * 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;
 *     }
 * }
 */
class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> arr = new ArrayList<>();
        if(root == null){
            return arr;
        }
        Deque<TreeNode> sta = new LinkedList<>();
        sta.push(root);
        while(!sta.isEmpty()){
            TreeNode cur = sta.pop();
            arr.add(cur.val);
            //先入右在入左,这样出栈的时候才能先出左再出右
            if(cur.right != null){
                sta.push(cur.right);
            }
            if(cur.left != null){
                sta.push(cur.left);
            }
        }
        return arr;
    }
}

2.中序的迭代遍历

/**
 * DeFinition for a binary tree node.
 * 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;
 *     }
 * }
 */
class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> arr = new ArrayList<>();
        if (root == null){
            return arr;
        }

        Deque<TreeNode> sta = new LinkedList<>();
        TreeNode cur = root;
        
        while(cur!=null || !sta.isEmpty()){
            //1.左
            while(cur!=null){
                sta.push(cur);
                cur = cur.left;
            }
            //2.根
            //此时cur为null,直接弹出栈顶元素
           cur = sta.pop();
           arr.add(cur.val);
           //3.右
           cur = cur.right;
        }
        return arr;
    }
}

3.后序遍历的迭代写法

/**
 * DeFinition for a binary tree node.
 * 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;
 *     }
 * }
 */
class Solution {
    public List<Integer> postorderTraversal(TreeNode root) {
        List<Integer> arr = new ArrayList<>();
        if (root == null){
            return arr;
        }
        TreeNode cur = root;
        Deque<TreeNode> sta = new LinkedList<>();
        TreeNode prev = null;
        while(cur!=null || !sta.isEmpty()){
            //左
            while(cur!=null){
                sta.push(cur);
                cur = cur.left;
            }
            cur = sta.pop();
            if(cur.right==null || cur.right==prev){
                //根
                arr.add(cur.val);
                prev = cur;
                cur = null;
            }else{ //右
                sta.push(cur);
                cur = cur.right;
            }
        }
        return arr;
    }
}

原文地址:https://www.jb51.cc/wenti/3280736.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐