算法:二叉树的前序、中序、后序遍历

二叉树的遍历主要有两种思路:一种是递归,另一种是栈。递归的思想是有二叉树的特点决定的,代码实现很简单,栈就稍微复杂一点。
1.递归实现二叉树的遍历
(1)二叉树的中序遍历

class Solution {
    List<Integer> res = new ArrayList<Integer>() ;
    public List<Integer> inorderTraversal(TreeNode root) {
        inorder(root);
        return res;
    }
    public void inorder(TreeNode root) {
        if(root == null){
            return ;
        }
        inorder(root.left);
        res.add(root.val);		//此行代码的位置直接决定了是那种遍历
        inorder(root.right);
    }
}

(2)前序遍历

class Solution {
    List<Integer> res = new ArrayList<Integer>() ;
    public List<Integer> inorderTraversal(TreeNode root) {
        inorder(root);
        return res;
    }
    public void inorder(TreeNode root) {
        if(root == null){
            return ;
        }
        res.add(root.val);		//此行代码的位置直接决定了是那种遍历
        inorder(root.left);
        inorder(root.right);
    }
}

(3)后序遍历

class Solution {
    List<Integer> res = new ArrayList<Integer>() ;
    public List<Integer> inorderTraversal(TreeNode root) {
        inorder(root);
        return res;
    }
    public void inorder(TreeNode root) {
        if(root == null){
            return ;
        }
        inorder(root.left);
        inorder(root.right);
        res.add(root.val);		//此行代码的位置直接决定了是那种遍历
    }
}

2.栈来实现二叉树的遍历
(1)中序遍历

class Solution {
    List<Integer> res = new ArrayList<Integer>();
    public List<Integer> inorderTraversal(TreeNode root) {
        Stack<TreeNode> stack = new Stack<>();
        while(true){
            while(root != null){
                stack.push(root);
                root = root.left;
            }
            if(stack.isEmpty()) {
                break;
            }
           root = stack.pop();
           res.add(root.val);
           root = root.right; 
        }
        return res;
    }
}

(2)前序遍历

class Solution {
    public List<Integer> preorderTraversal(TreeNode root){
        List<Integer> res = new ArrayList<>();
        Stack<TreeNode> stack = new Stack<>();

        if(root == null) return res;

        stack.push(root);
        while(!stack.isEmpty()){
            TreeNode node = stack.pop();
            res.add(node.val);

            if(node.right != null) stack.push(node.right);
            if(node.left != null) stack.push(node.left);
        }
        return res;
    }
}

(3)后序遍历

class Solution{
    List<Integer> res = new ArrayList<Integer>();
    public List<Integer> postorderTraversal(TreeNode root){
        Stack<TreeNode> stack = new Stack<>();
        while(true){
            while(root != null){
                stack.push(root);
                root = root.right;
            }
            if(stack.isEmpty()){
                break;
            }
            root = stack.pop();
            root = root.left;
            res.add(root.val);
        }
        return res;
    }
}

おすすめ

転載: blog.csdn.net/weixin_48929324/article/details/117339679