二叉树的多种遍历方式

前序遍历(递归实现)

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);
    }
}

二叉搜索树

相关推荐
云边有个稻草人6 小时前
部分移动(Partial Move)的使用场景:Rust 所有权拆分的精细化实践
开发语言·算法·rust
泡沫冰@8 小时前
数据结构(20)
数据结构
松涛和鸣8 小时前
11.C 语言学习:递归、宏定义、预处理、汉诺塔、Fibonacci 等
linux·c语言·开发语言·学习·算法·排序算法
2501_941111249 小时前
C++与自动驾驶系统
开发语言·c++·算法
2501_941111699 小时前
C++中的枚举类高级用法
开发语言·c++·算法
jz_ddk10 小时前
[算法] 算法PK:LMS与RLS的对比研究
人工智能·神经网络·算法·信号处理·lms·rls·自适应滤波
Miraitowa_cheems10 小时前
LeetCode算法日记 - Day 106: 两个字符串的最小ASCII删除和
java·数据结构·算法·leetcode·深度优先
旭编10 小时前
小红的好矩形
c++·算法
小白程序员成长日记10 小时前
2025.11.12 力扣每日一题
算法·leetcode·职场和发展
Alex艾力的IT数字空间10 小时前
设计既保持高性能又兼顾可移植性的跨平台数据结构
数据结构·分布式·算法·微服务·中间件·架构·动态规划