leetcode144,94,145

二叉树的前中后序遍历

递归方式:
1:确定递归函数的参数和返回值
2:确定终止条件
3:确定单层递归的逻辑

class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> result = new ArrayList<Integer>();
        preorder(root, result);
        return result;
    }

    public void preorder(TreeNode root, List<Integer> result) {//确定返回值
        if (root == null) {    //确定终止条件
            return;
        }
        result.add(root.val);     //前序遍历   
        preorder(root.left, result);
        preorder(root.right, result);
    }
}

二叉树的非递归前中后序遍历(迭代法)

class Solution {  //前序遍历  进栈顺序:中左右
    public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> result=new ArrayList<Integer>();
        if(root==null){
            return result;
        }
        Stack<TreeNode> stack=new Stack<>();
        stack.push(root);  //根节点先入栈
        while(!stack.isEmpty()){   //根出栈,先存入数组中
            TreeNode node=stack.pop();
            result.add(node.val);  //先右孩子再左孩子入栈
            if(node.right!=null){
                stack.push(node.right);
            }
            if(node.left!=null){
                stack.push(node.left);
            }
        }
        return result;
    }

}
class Solution {
    public List<Integer> postorderTraversal(TreeNode root) {
        List<Integer> result=new ArrayList<Integer>();
        if(root==null){
            return result;
        }
        Stack<TreeNode> stack=new Stack<>();
        stack.push(root);
        while(!stack.isEmpty()){
            TreeNode node=stack.pop();
            result.add(node.val);
            if(node.left!=null){
                stack.push(node.left);//后续遍历只需要 调整一下  中左右,然后直接反转数组就可以得到后序遍历
            }
            if(node.right!=null){
                stack.push(node.right);
            }
        }
        Collections.reverse(result);
        return result;
    }
}

中序遍历的迭代法

前面的前序遍历,要处理的元素和遍历(遍历是先根再左或者右)的元素是一致的,所以可以同步处理,但是中序遍历却做不到,

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


        if(root==null){
            return result;
        }
        TreeNode cur=root;
        while(cur!=null||!stack.isEmpty()){
            if(cur!=null){
                stack.push(cur);   //左子树一直遍历到底,栈依次存入便利的节点。然后弹出每个节点(弹出的顺序是先子节点再父节点),弹出的节点存入数组中,
                cur=cur.left;
            }else{
                cur=stack.pop();   //遍历到底后,弹出栈(同时存入数组中),然后处理右节点
                result.add(cur.val);
                cur=cur.right;
            }
        }
        return result;
    }

}

对于前中后序遍历使用递归法 我们可以统一写法,迭代法也可以统一写法。

迭代法中序遍历不能统一是因为处理和遍历方式不一致,解决这个问题

posted on   你是千堆雪我是长街7  阅读(5)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示