二叉树的多种遍历方式

前序遍历(递归实现)

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

二叉搜索树

相关推荐
Lucis__4 分钟前
哈希实现&封装unordered系列容器
数据结构·c++·算法·哈希封装
爱编程的小吴23 分钟前
【力扣练习题】热题100道【哈希】189. 轮转数组
算法·leetcode·哈希算法
wjykp25 分钟前
105~108SVMf
算法
星火开发设计29 分钟前
栈的深度解析与C++实现
开发语言·数据结构·c++·学习·知识
leoufung37 分钟前
LeetCode 322. Coin Change:从错误思路到正确一维 DP
算法·leetcode·职场和发展
旧梦吟41 分钟前
脚本网页 双子星棋
算法·flask·游戏引擎·css3·html5
ullio1 小时前
arc205d - Non-Ancestor Matching
算法
wa的一声哭了1 小时前
内积空间 正交与正交系
java·c++·线性代数·算法·矩阵·eclipse·云计算
SWAGGY..1 小时前
数据结构学习篇(8)---二叉树
数据结构·学习·算法