二叉树的多种遍历方式

前序遍历(递归实现)

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

二叉搜索树

相关推荐
.格子衫.8 小时前
022数据结构之树状数组——算法备赛
数据结构·算法·1024程序员节
黑科技Python9 小时前
生活中的“小智慧”——认识算法
学习·算法·生活
Yupureki9 小时前
从零开始的C++学习生活 16:C++11新特性全解析
c语言·数据结构·c++·学习·visual studio
sali-tec10 小时前
C# 基于halcon的视觉工作流-章52-生成标定板
开发语言·图像处理·人工智能·算法·计算机视觉
IT古董10 小时前
【第五章:计算机视觉-项目实战之推荐/广告系统】2.粗排算法-(4)粗排算法模型多目标算法(Multi Task Learning)及目标融合
人工智能·算法·1024程序员节
熬了夜的程序员10 小时前
【LeetCode】89. 格雷编码
算法·leetcode·链表·职场和发展·矩阵
對玛祷至昏10 小时前
数据结构理论知识
数据结构·算法·排序算法
oliveira-time10 小时前
二分搜索(Binary Search)
算法
黄思搏11 小时前
红黑树 - Red-Black Tree 原理与 C# 实现
数据结构·1024程序员节