二叉树的多种遍历方式

前序遍历(递归实现)

java 复制代码
class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
         List<Integer> list=new ArrayList<>();
        return prio(root,list);
    }
    public List<Integer>    prio(TreeNode a,List<Integer>list)
    {
       
        if(a==null)
        return list;
        list.add(a.val);
        prio(a.left,list);
        prio(a.right,list);
        return list;

    }
}

中序遍历(递归实现)

java 复制代码
class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> list=new ArrayList<>();
        return  zhong(root,list);
    }
    public List<Integer> zhong(TreeNode a,List<Integer>list)
    {
       if(a==null)
       return list;
        zhong(a.left,list);
        list.add(a.val);
        zhong(a.right,list);
        return list;
    }

}

后序遍历(递归实现)

java 复制代码
class Solution {
    public List<Integer> postorderTraversal(TreeNode root) {
        List<Integer> list=new ArrayList<>();
        return hou(root,list);
    }
    public List<Integer> hou(TreeNode node,List<Integer>list)
    {
        if(node==null)
        return list;
        hou(node.left,list);
        hou(node.right,list);
        list.add(node.val);
        return list;
    }
}

非递归实现中序遍历

java 复制代码
class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> list=new ArrayList<>();
        LinkedList<TreeNode> stack=new LinkedList<>();//栈记录走过的路程
        //非递归实现
        while(root!=null||!stack.isEmpty())
        {
            if(root!=null)
            {
            stack.push(root);
            root=root.left;
            }else
            {
                TreeNode pop=stack.pop();
                list.add(pop.val);
                 root=pop.right;
            }
        }
        return list;
    }
}

非递归实现前序遍历

java 复制代码
class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
         List<Integer> list=new ArrayList<>();
         LinkedList<TreeNode> stack=new LinkedList<>();
         while(root!=null||!stack.isEmpty())
         {
            if(root!=null)
            {
            list.add(root.val);
            stack.push(root);
            root=root.left;
            }else{
                TreeNode pop=stack.pop();
                root=pop.right;
            }
         }
         return list;
    }
}

后序遍历(非递归实现)

java 复制代码
class Solution {
    public List<Integer> postorderTraversal(TreeNode root) {
        List<Integer> list=new ArrayList<>();
        LinkedList<TreeNode> stack=new LinkedList<>();
        TreeNode pop=null;
        while(root!=null||!stack.isEmpty())
        {
            if(root!=null)
            {
                stack.push(root);
                root=root.left;
            }else{
                TreeNode peek=stack.peek();
            if(peek.right==null||peek.right==pop)
            {
                pop=stack.pop();
                list.add(pop.val);
            }
            else{
                root=peek.right;
            }

            }
            
        }
        return list;
    }
}

力扣------对称二叉树

判断二叉树是不是对称二叉树

java 复制代码
代码实现(递归解法)
class Solution {
    public boolean isSymmetric(TreeNode root) {
        return duichen(root.left,root.right); 
    }
    public boolean duichen(TreeNode left,TreeNode right)
    {
        if(right==null&&left==null)
        {
            return true;
        }
        if(right==null||left==null)
        {
            return false;
        }
        if(left.val!=right.val)
        {
            return false;
        }
       return duichen(left.left,right.right)&&duichen(left.right,right.left);
    }
}

迭代解法

力扣------二叉树的最大深度

java 复制代码
class Solution {
    public int maxDepth(TreeNode root) {
        if(root==null)
        return 0;
        if(root.left==null&&root.right==null)
        {
            return 1;
        }
        int a=maxDepth(root.left);
        int b=maxDepth(root.right);
        int i=Math.max(a,b);
        return i+1;
    }
}

力扣------二叉树的最小深度

java 复制代码
import java.util.*;
class Solution {
    public int minDepth(TreeNode root) {
        if(root==null)
        return 0;
        int a=minDepth(root.left);
        int b=minDepth(root.right);
        int i=Math.min(a,b);
        //要多做一个判断,如果左子树/右子树为0,那么就以不为0的那个为准
        if(a==0)
        return b+1;
        if(b==0)
        return a+1;
        return i+1;
    }
}

力扣-翻转二叉树

java 复制代码
class Solution {
    public TreeNode flipTree(TreeNode root) {
        fn(root);
        return root;
    }
    public void fn(TreeNode node)
    {
        if(node==null)
        {
            return;
        }
        TreeNode temp=node.left;
        node.left=node.right;
        node.right=temp;
        fn(node.left);
        fn(node.right);
    }
}

二叉搜索树

相关推荐
行云流水201932 分钟前
编程竞赛算法选择:理解时间复杂度提升解题效率
算法
smj2302_796826522 小时前
解决leetcode第3768题.固定长度子数组中的最小逆序对数目
python·算法·leetcode
cynicme2 小时前
力扣3531——统计被覆盖的建筑
算法·leetcode
core5123 小时前
深度解析DeepSeek-R1中GRPO强化学习算法
人工智能·算法·机器学习·deepseek·grpo
mit6.8243 小时前
计数if|
算法
a伊雪3 小时前
c++ 引用参数
c++·算法
Data_agent4 小时前
1688获得1688店铺列表API,python请求示例
开发语言·python·算法
2301_764441335 小时前
使用python构建的应急物资代储博弈模型
开发语言·python·算法
小熳芋5 小时前
验证二叉搜索树- python-递归&上下界约束
数据结构
hetao17338375 小时前
2025-12-11 hetao1733837的刷题笔记
c++·笔记·算法