zoukankan      html  css  js  c++  java
  • 二叉树的几种遍历

    二叉树遍历

    二叉树结构

    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;
    }
    
  • 相关阅读:
    React在componentDidMount里面发送请求
    React 术语词汇表
    React里受控与非受控组件
    React和Vue等框架什么时候操作DOM
    【LeetCode】79. Word Search
    【LeetCode】91. Decode Ways
    【LeetCode】80. Remove Duplicates from Sorted Array II (2 solutions)
    【LeetCode】1. Two Sum
    【LeetCode】141. Linked List Cycle (2 solutions)
    【LeetCode】120. Triangle (3 solutions)
  • 原文地址:https://www.cnblogs.com/truestoriesavici01/p/13662878.html
Copyright © 2011-2022 走看看