• 二叉树的几种遍历


    二叉树遍历

    二叉树结构

    public class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;
    
        public TreeNode() {}
    
        public TreeNode(int val){
            this(val, null, null);
        }
    
        public TreeNode(int val, TreeNode left, TreeNode right){
            this.val = val;
            this.left = left;
            this.right = right;
        }
    }
    

    前序遍历

    递归

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

    非递归

    public List<Integer> preOrder(TreeNode root) {
    	List<Integer> list = new ArrayList<>();
        if(root == null) return list;
        Stack<TreeNode> stack = new Stack<>();
        while(!stack.isEmpty()) {
        	TreeNode e = stack.pop();
            if(e != null) {
            	if(e.right != null) stack.push(e.right);
                if(e.left != null) stack.push(e.left);
                stack.push(e);
                stack.push(null);
            } else {
            	list.add(stack.pop().val);
            }
        }
        return list;
    }
    

    Morris前序遍历(非递归,空间 O(1) ,时间 O(n) )

    public List<Integer> preOrder(TreeNode root) {
    	List<Integer> list = new ArrayList<>();
        TreeNode curr = root, prev = null;
        while(curr != null) {
        	if(curr.left == null){
            	list.add(curr.val);
                curr = curr.right;
            } else {
            	prev = curr.left;
                while(prev.right != null && prev.right != curr)
                    prev = prev.right;
                if(prev.right == null) {
                	list.add(curr.val);
                    prev.right = curr;
                    curr = curr.left;
                } else {
                	prev.right = null;
                    curr = curr.right;
                }
            }
        }
        return list;
    }
    

    中序遍历

    递归

    List<Integer> list = new ArrayList<>();
    public List<Integer> inOrder(TreeNode root){
        if (root == null) return list;
        inOrder(root.left);
        list.add(root.val);
        inOrder(root.right);
        return list;
    }
    

    非递归

    public List<Integer> inOrder(TreeNode root) {
    	List<Integer> list = new ArrayList<>();
        if(root == null) return list;
        Stack<TreeNode> stack = new Stack<>();
        stack.push(root);
        while(!stack.isEmpty()) {
        	TreeNode e = stack.pop();
            if(e != null) {
            	if(e.right != null) stack.push(e.right);
                stack.push(e);
                stack.push(null);
                if(e.left != null) stack.push(e.left);
            } else {
            	list.add(stack.pop().val);
            }
        }
        return list;
    }
    

    Morris中序遍历(非递归,空间 O(1) ,时间 O(n) ):

    public List<Integer> inOrder(TreeNode root){
    	List<Integer> list = new ArrayList<>();
        TreeNode curr = root, prev = null;
        while(curr != null){
        	if(curr.left == null){
            	list.add(curr.val);
                curr = curr.right;
            }
            else {
            	prev = curr.left;
                while(prev.right != null && prev.right != curr)
                    prev = prev.right;
                if(prev.right == null) {
                	prev.right = curr;
                    curr = curr.left;
                } else {
                	prev.right = null;
                    list.add(curr.val);
                    curr = curr.right;
                }
            }
            return list;
        }
    }
    

    后序遍历

    递归

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

    非递归

    public List<Integer> postOrder(TreeNode root) {
    	List<Integer> list = new ArrayList<>();
        if(root == null) return list;
        Stack<TreeNode> stack = new Stack<>();
        stack.push(root);
        while(!stack.isEmpty()) {
        	TreeNode e = stack.pop();
            if(e != null) {
            	stack.push(e);
                stack.push(null);
                if(e.right != null) stack.push(e.right);
                if(e.left != null) stack.push(e.left);
            } else {
            	list.add(stack.pop().val);
            }
        }
        return list;
    }
    

    Moirrs后序遍历(非递归,空间 O(1) ,时间 O(n) )

    List<Integer> list = new ArrayList<>();
    public List<Integer> postOrder(TreeNode root){
    	TreeNode dump = new TreeNode(0);
        dump.left = root;
        TreeNode curr = dump, prev = null;
        while (curr != null) {
        	if(curr.left == null)
                curr = curr.right;
            else {
            	prev = curr.left;
                while(prev.right != null && prev.right != curr)
                    prev = prev.right;
                if(prev.right == null) {
                	prev.right = curr;
                    curr = curr.left;
                } else {
                	visit(curr.left, prev);
                    prev.right = null;
                    curr = curr.right;
                }
            }
        }
        return list;
    }
    
    private void visit(TreeNode from, TreeNode to) {
    	reverse(from, to);
        TreeNode p = to;
        while(true) {
        	list.add(p.val);
            if(p == from) break;
            p = p.right;
        }
        reverse(to, from);
    }
    
    private void reverse(TreeNode from, TreeNode to) {
    	if(from == to) return;
        TreeNode prev = from, curr = from.right, next = null;
        while(true) {
        	next = curr.right;
            curr.right = prev;
            prev = curr;
            curr = next;
            if(prev == to) break;
        }
    }
    

    层序遍历

    非递归

    public static List<List<Integer>> levelOrder(TreeNode root) {
    	List<List<Integer>> res = new LinkedList<>();
        if(root == null) return res;
        
        Deque<TreeNode> queue = new LinkedList<>();
        queue.addLast(root);
        while(!queue.isEmpty()) {
        	int size = queue.size();
            List<Integer> row = new LinkedList<>();
            for(int i = 0; i < size; i++) {
            	TreeNode remove = queue.removeFirst();
                row.add(remove.val);
                if(remove.left != null) queue.add(remove.left);
                if(remove.right != null) queue.add(remove.right);
            }
            res.add(row);
        }
        return res;
    }
    
  • 相关阅读:
    luarocks argparse
    Shell中for循环的几个常用写法
    linux
    Docker修改镜像源为阿里云
    ntpdate更新服务器时间失败
    linux文本三剑客之 sed
    [Union]C++中Union学习笔记
    [sublime] 利用sublime搭建C/C++编译器
    [wordpress]WordPress地址(URL)错误,修改解决方案
    [wordpress]更新插件时,免去FTP操作
  • 原文地址:https://www.cnblogs.com/truestoriesavici01/p/13662878.html
Copyright © 2020-2023  润新知