数据结构

二叉树的遍历(非递归)

图片说明

前序遍历

遵从 根左右 遍历,结果为:GDAFEMHZ
二叉树前序非递归遍历使用到的是栈,先加入右节点,再加入左节点。

public List<Node> preorderTraversal(TreeNode root) {
        if(root == null) return new ArrayList();
        List list = new ArrayList();
        LinkedList stack = new LinkedList();
        stack.push(root);
        while(!stack.isEmpty()){
            TreeNode node = stack.pop();
            list.add(node.val);
            if(node.right != null){
                stack.push(node.right);
            }
            if(node.left != null){
                stack.push(node.left);
            }
        }
        return list;
    }

中序遍历

遵从 左根右 遍历,结果为:ADEFGHMZ
二叉树中序非递归遍历使用到的是栈。需要一个临时的cur变量

public static List<Node> inOrder(Node root){
        if (root == null) {
            return new ArrayList<>();
        }
        List<Node> list = new ArrayList<>();
        LinkedList<Node> stack = new LinkedList<>();
        Node cur = root;
        while(!stack.isEmpty() || cur != null) {
            while(cur != null) {
                stack.push(cur);
                cur = cur.left;
            }
            Node node = stack.pop();
            list.add(node);
            if(node.right != null) {
                cur = node.right;
            }
        }
        return list;
    }

后序遍历

遵从 左右根 遍历,结果为:AEFDHZMG
二叉树后序非递归遍历使用到的是栈。需要一个临时的cur变量。

public static List<Node> postOrder(Node root){
        if(root == null) return new ArrayList<>();
        List<Node> list = new ArrayList<>();
        LinkedList<Node> stack = new LinkedList<>();
        Node cur = root;
        stack.push(cur);
        while(!stack.isEmpty()) {
            Node node = stack.peek();
            if(node.left != null && node.left != cur && node.left != cur) {
                stack.push(node.left);
            }else if(node.right != null && node.right != cur) {
                stack.push(node.right);
            }else {
                list.add(stack.pop());
                cur = node;
            }
        }
        return list;
    }

层序遍历

遵从 左右根 遍历,结果为:GDMAFHZE
二叉树的层序遍历使用的是队列。

public static List<Node> cengOrder(Node root){
        if(root == null) return new ArrayList<>();
        List<Node> list = new ArrayList<>();
        LinkedList<Node> queue = new LinkedList<>();
        queue.offer(root);
        while(!queue.isEmpty()) {
            Node node = queue.poll();
            list.add(node);
            if(node.left != null) {
                queue.offer(node.left);
            }
            if(node.right != null) {
                queue.offer(node.right);
            }
        }
        return list;
    }

结束,必须掌握的知识,背也要背下来。

全部评论

相关推荐

1 收藏 评论
分享
牛客网
牛客企业服务