代码随想录算法训练营第十四天| 二叉树相关递归遍历以及迭代遍历

二叉树的递归遍历
递归三要素:确定递归函数的参数和返回值,确定终止条件,确定单层递归的逻辑


144. 二叉树的前序遍历
https://leetcode.cn/problems/binary-tree-preorder-traversal/description/

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

前序迭代

public List<Integer> preorderTraversal(TreeNode root) {
        Deque<TreeNode> deque = new ArrayDeque<>();
        List<Integer> list = new ArrayList<>();
        if (root != null) deque.addFirst(root);
        while (!deque.isEmpty()){
            TreeNode node = deque.pollFirst();
            list.add(node.val);
            if (node.right != null) deque.addFirst(node.right);
            if (node.left != null) deque.addFirst(node.left);
        }
        return list;
    }

总结:入栈顺序:中右左,出战顺序就是中左右
后序迭代

public List<Integer> postorderTraversal(TreeNode root) {
        Deque<TreeNode> deque = new LinkedList<>();
        List<Integer> list = new ArrayList<>();
        if (root != null) deque.addFirst(root);
        while (!deque.isEmpty()){
            TreeNode node = deque.pollFirst();
            list.add(node.val);
            if (node.left != null) deque.addFirst(node.left);
            if (node.right != null) deque.addFirst(node.right);
        }
        Collections.reverse(list);
        return list;
    }

总结:入栈顺序:中左右,出栈顺序:中右左,再list翻转,就是左右中了。
中序迭代

public List<Integer> inorderTraversal(TreeNode root) {
        Deque<TreeNode> deque = new LinkedList<>();
        List<Integer> list = new ArrayList<>();
        TreeNode p = root;
        while (p != null || !deque.isEmpty()){
            if (p != null){
                deque.addFirst(p);
                p = p.left;
            }else {
                p = deque.pollFirst();
                list.add(p.val);
                p = p.right;
            }
        }
        return list;
    }

总结:中序迭代和前序后序的不一样,中序迭代核心思想:让p一路向左,当p没有左了,栈弹出并p指向他,加入list,p再向右,这样就完成了左中右的操作,注意中序迭代要放在一个while循环里,因为每次想加入list的前提就是当前的p节点没有左孩子。

层序遍历非递归

public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> resList = new ArrayList<>();
        Deque<TreeNode> deque = new LinkedList<>();
        if (root == null) return resList;
        deque.offer(root);
        while (!deque.isEmpty()){
            List<Integer> list = new ArrayList<>();
            int size = deque.size();
            for (int i = 0; i < size; i++) {
                TreeNode node = deque.poll();
                list.add(node.val);
                if (node.left != null) deque.offer(node.left);
                if (node.right != null) deque.offer(node.right);
            }
            resList.add(list);
        }
        return resList;
    }

总结:注意for循环中如果写i < deque.size()会发生错误,因为每次for循环deque的长度都在变。
层序遍历递归
//todo

posted @   jeasonGo  阅读(3)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示