二叉树的排序算法(先序遍历,中序遍历,后序遍历,宽度优先遍历)

在计算机科学中,二叉树是一种基础而强大的数据结构,它广泛应用于各种算法和问题的解决方案中。作为一种树形结构,二叉树在组织和管理数据方面展示了其独特的优势。本文将深入探讨二叉树的基本概念、主要类型以及常见的算法,旨在帮助读者全面理解如何利用二叉树优化程序性能和解决实际问题。无论你是算法新手还是经验丰富的开发者,希望这篇博客能为你提供清晰的思路和实用的技巧。

二叉树

二叉树是一种特殊的树结构,其中每个节点最多有两个子节点,通常称为左子节点和右子节点。它的特点是每个节点的子节点数量被限制在两个以内。二叉树的类型包括完全二叉树、满二叉树和二叉搜索树等,每种类型有不同的特性和应用场景。通过这种结构,可以高效地进行数据的存储和检索操作。

下面是一个简单的代码示例:

Class TreeNode{

public TreeNode left;

public TreeNode right;

public int val;

public TreeNode(int data){
    this.val=date;
}

}

先序遍历

二叉树遍历方式的命名顺序都是根据根节点的位置命名的,所以先序遍历的意思是“根左右”,如图所示的例子中按照线序遍历的排序为:FDBACEGIHJ

当我们遍历二叉树时最后的目标是想让他按照我们规定的顺序弹出,所以我们想到用栈来完成这个问题

代码:

public void preOrder(TreeNode root){
   if (root != null){
       Stack<Node> stack=new Stack<>();//创建一个栈
       stack.push(root);
       while (!stack.isEmpty()){
                root=stack.pop();
                System.out.println(root.val+" "); //第一步:在栈中弹出一个元素
                if (root.right!=null){
                    stack.push(root.right);
                }if (root.left!=null){
                    stack.push(root.left);//如果左右都不为空先压右再压左
                }
            }
        }
        System.out.println();
}

因为最后的顺序是先左后右,而栈的特点是先进后出,所以在代码中要压入右子树再压入左子树

中序遍历

同理来说,中序遍历的顺序就是“左根右”,还是用栈来实现。最后的排序是“左”在第一位,所以我们要从根节点开始先完成对左子树的操作,将沿途节点全部压入栈中直到左子树为空弹出一个节点,这个节点就是我们最后排序过程中的第一个节点。在处理完左子树之后我们就该弹出根节点,所以我们使用栈不为空的条件来接着向下弹出根节点,最后处理右子树循环往复。

代码:

public void inOrder(TreeNode root){
    if(root != null){
        Stack<TreeNode> s1 = new Stack<>();
        while(root != null || !s1.empty()){
            if(root != null){
            s1.push(root); //将沿途节点压入栈中
            root = root.left;
            }else{
                root= s1.pop(); //弹出最左侧节点
                System.out.println(root.val+" ");
                root = root.right; //同理处理右子树
                }
        }
    }
}

后序遍历


后序遍历的顺序是左右根,这就需要最后处理最先进入栈的根节点,是遍历算法中最复杂的一个。由于栈的特性是先进后出,所以我们需要两个栈来完成排序。

代码:

public void postOrder(TreeNode root){
    if(root != null){
    Stack<TreeNode> s1 = new Stack<>();
    Stack<TreeNode> s2 = new Stack<>();
    
    s1.push(root); //压入头节点
    while(!s1.empty()){
        root = s1.pop();
        s2.push(root); //因为第一个进栈的节点要最后一个出所以将根要放到s2中
        //如果有左右子树就先压左再压右,因为右在左后面
        if(root.left != null){
            s1.push(root.left);
        }
        if(root.right != null){
            s1.push(root.right);
        }
    }
    }
    //遍历s2,得到的就是正确的顺序
    while(!s2.empty()){
    TreeNode node = s2.pop();
    System.out.println(node.val+"");
}
}

宽度优先遍历

顾名思义就是横向遍历二叉树,以文章开头的二叉树为例,宽度优先遍历的顺序为:ABCDEFG

原理很简单就是根节点然后遍历左节点和右节点

以下是一道经典例题,返回二叉树的最大宽度

代码:

 public int wide(Node head){
        if (head == null){
            return 0;
        }
        Queue queue=new LinkedList<>();
        queue.add(head);//把头节点压入队中
        HashMap<Node,Integer> levelMap=new HashMap<>();
        //创建一个map集合用来记录当前结点正处于第几层
        levelMap.put(head,1);//初始值在第一层
        int curlevel=1;//表示当前层次
        int curlevelNodes=0;//当前层节点数
        int max=Integer.MIN_VALUE;//用来记录最大宽度是多少
        while (!queue.isEmpty()){
            Node cur = (Node) queue.poll();
            int curlNodelevel=levelMap.get(cur);//得到当前结点得层数
            if (curlNodelevel==curlevel){//当前结点得层数如果与当前层数相同
                curlevelNodes++;
            }else {
                max=Math.max(max,curlevelNodes);//更新最大值
                curlevel++;
                curlevelNodes=1;//节点数回归
            }
            //然后左一个右一个进队
            if (cur.left!=null){
                levelMap.put(cur.left,curlNodelevel+1);
                queue.add(head.left);
            }if (cur.right!=null){
                levelMap.put(cur.right,curlNodelevel+1);
                queue.add(head.right);
            }
        }
        return max;
    }

基于SSM框架的智能家政保洁预约系统,是一个旨在提高家政保洁服务预约效率和管理水平的平台。该系统通过集成现代信息技术,为家政公司、家政服务人员和消费者提供了一个便捷的在线预约和管理系统。 系统的主要功能包括: 1. **用户管理**:允许消费者注册、登录,并管理他们的个人资料和预约历史。 2. **家政人员管理**:家政服务人员可以注册并更新自己的个人信息、服务类别和服务时间。 3. **服务预约**:消费者可以浏览不同的家政服务选项,选择合适的服务人员,并在线预约服务。 4. **订单管理**:系统支持订单的创建、跟踪和管理,包括订单的确认、完成和评价。 5. **评价系统**:消费者可以在家政服务完成后对服务进行评价,帮助提高服务质量和透明度。 6. **后台管理**:管理员可以管理用户、家政人员信息、服务类别、预约订单以及处理用户反馈。 系统采用Java语言开发,使用MySQL数据库进行数据存储,通过B/S架构实现用户与服务的在线交互。系统设计考虑了不同用户角色的需求,包括管理员、家政服务人员和普通用户,每个角色都有相应的权限和功能。此外,系统还采用了软件组件化、精化体系结构、分离逻辑和数据等方法,以便于未来的系统升级和维护。 智能家政保洁预约系统通过提供一个集中的平台,不仅方便了消费者的预约和管理,也为家政服务人员提供了一个展示和推广自己服务的机会。同时,系统的后台管理功能为家政公司提供了强大的数据支持和决策辅助,有助于提高服务质量和管理效率。该系统的设计与实现,标志着家政保洁服务向现代化和网络化的转型,为管理决策和控制提供保障,是行业发展中的重要里程碑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值