二叉树相关算法汇总(详细)

二叉树基本知识

二叉树(Binary Tree)是n(n≥0)个有限元素的集合,该集合或者为空,或者由一个称为根(root)的元素及两个不相交的、被分别称为左子树和右子树的二叉树组成。当集合为空时,称该二叉树为空二叉树。

二叉树常见概念:

  • 结点的度。结点所拥有的子树的个数称为该结点的度。
  • 叶子结点。度为0的结点称为叶子结点,或者称为终端结点。
  • 分支结点。度不为0的结点称为分支结点,或者称为非终端结点。一棵树的结点除叶子结点外,其余的都是分支结点。
  • 左孩子、右孩子、双亲。树中一个结点的子树的根结点称为这个结点的孩子。这个结点称为它孩子结点的双亲。具有同一个双亲的孩子结点互称为兄弟。
  • 路径、路径长度。如果一棵树的一串结点n1,n2,…,nk有如下关系:结点ni是ni+1的父结点(1≤i<k),就把n1,n2,…,nk 称为一条由n1 至nk 的路径。这条路径的长度是k-1。
  • 祖先、子孙。在树中,如果有一条路径从结点M到结点N,那么M就称为N的祖先,而N称为M的子孙。
  • 结点的层数。规定树的根结点的层数为1,其余结点的层数等于它的双亲结点的层数加1。
  • 满二叉树。在一棵二叉树中,如果所有分支结点都存在左子树和右子树,并且所有叶子结点都在同一层上,这样的一棵二叉树称作满二叉树。
  • 完全二叉树。叶子结点只能出现在最下层和次下层,且最下层的叶子结点集中在树的左部。需要注意的是,满二叉树肯定是完全二叉树,而完全二叉树不一定是满二叉树。
  • 二叉搜索树。又:二叉查找树,二叉排序树它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。二叉搜索树作为一种经典的数据结构,它既有链表的快速插入与删除操作的特点,又有数组快速查找的优势;所以应用十分广泛,例如在文件系统和数据库系统一般会采用这种数据结构进行高效率的排序与检索操作。

二叉树遍历方法

层序遍历

解释&模板

逐层遍历,从上到下从左到右的顺序,对应的广度优先搜索,通过队列实现:

在这里插入图片描述

  • 对于队列,现进先出。从根节点的节点push到队列,那么队列中先出来的顺序是第二层的左右(假设有)。第二层每个执行的时候添加到队列,那么添加的所有节点都在第二层后面。

java实现模板:

void bfs(TreeNode root) {
   
    Queue<TreeNode> queue = new ArrayDeque<>();
    queue.add(root);
    while (!queue.isEmpty()) {
   
        int n = queue.size();
        for (int i = 0; i < n; i++) {
    
            TreeNode node = queue.poll();
            if (node.left != null) {
   
                queue.add(node.left);
            }
            if (node.right != null) {
   
                queue.add(node.right);
            }
        }
    }
}
层序遍历算法题:

102. 二叉树的层序遍历

本题不同于上面模板在于要将每层的内容放到不通的数组内部,只要记录每层个数,根据个数定量取出即可:

    public List<List<Integer>> levelOrder(TreeNode root) {
   
        List<List<Integer>> res = new ArrayList<>();
        Queue<TreeNode> queue = new ArrayDeque<>();
        if (root != null) queue.add(root);

        while (!queue.isEmpty()) {
   
            // 获取本层节点个数
            int size = queue.size();
            List<Integer> level = new ArrayList<>();
            // 通过循环将本层节点全部取出
            for (int i = 0; i < size; ++i) {
   
                TreeNode node = queue.poll();
                level.add(node.val);
                //添加下层节点
                if (node.left != null) queue.add(node.left);
                if (node.right != null) queue.add(node.right);
            }
            res.add(level);
        }
        return res;
    }

103. 二叉树的锯齿形层次遍历

相对于上一题,本题多了一点,就是需要将奇数层的数列进行翻转:

    public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
   
        List<List<Integer>> res = new ArrayList<>();
        Queue<TreeNode> queue = new ArrayDeque<>();
        if (root != null) queue.add(root);
        int n = 0;
        while (!queue.isEmpty()) {
   
            // 获取本层节点个数
            int size = queue.size();
            List<Integer> level = new ArrayList<
  • 7
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值