数据结构-二叉树【基础篇】

概念

节点的度: 表示当前节点含有的字树的个数。
树的度: 当前树中最大节点的度就是树的度。
叶子节点: 度为0的节点,也就是没有子树的节点。
在二叉树中,树的度为2,且一个节点最多存在两颗子树,子树有左右顺序之分。
在这里插入图片描述

两种特殊的二叉树

1、 满二叉树: 一棵二叉树,如果每层的结点数都达到最大值,则这棵二叉树就是满二叉树。若满二叉树的层高为k,则满二叉树的节点个数为2^k - 1。第k层的节点个数为2^(k-1)。
在这里插入图片描述
2、完全二叉树: 完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从0至n-1的结点一一对应时称之为完全二叉树。 要注意的是满二叉树是一种特殊的完全二叉树。
在这里插入图片描述

二叉树的性质

1、对任何一棵二叉树, 如果其叶结点个数为 n0, 度为2的非叶结点个数为 n2,则有n0=n2+1
2、具有n个结点的完全二叉树的深度k为log_2(n + 1) 向上取整。
3、在完全二叉树中,度为1的节点要么是0个,要么是1个,故当完全二叉树的总节点个数 (n0 + n1 + n2 = 2n2 + n1 + 1) 为奇数时,不可能存在度为1的节点。

二叉树的存储

二叉树的存储结构分为:顺序存储和类似于链表的链式存储。
二叉树的链式存储是通过一个一个的节点引用起来的,常见的表示方式有二叉和三叉表示方式。

// 孩子表示法
class Node {
	int val; // 数据域
	Node left; // 左孩子的引用,常常代表左孩子为根的整棵左子树
	Node right; // 右孩子的引用,常常代表右孩子为根的整棵右子树
}
// 孩子双亲表示法
class Node {
	int val; // 数据域
	Node left; // 左孩子的引用,常常代表左孩子为根的整棵左子树
	Node right; // 右孩子的引用,常常代表右孩子为根的整棵右子树
	Node parent; // 当前节点的根节点
}

二叉树的节点个数

    // 传入一颗以root为根的二叉树,就能求出该树的结点个数
    public int treeNodeSize(TreeNode root) {
//        // 1.base case
//        if (root == null) {
//            return 0;
//        }
//        // 整棵树的结点个数 = 自己1 + 左子树的所有节点 + 右子树的所有节点
//        return 1 + treeNodeSize(root.left) + treeNodeSize(root.right);
        return root == null ? 0 : 1 + treeNodeSize(root.left) + treeNodeSize(root.right);
    }

二叉树的第k层的节点个数

    // 传入一颗以root为根的二叉树,就能求出第k层的结点个数
    public int getKLevelNodes(TreeNode root,int k) {
        // 1.base case
        if (root == null || k <= 0) {
            return 0;
        }
        if (k == 1) {
            return 1;
        }
        // 第k层的结点个数 = 左子树的第k-1层结点个数 +右子树的第k - 1层结点个数
        return getKLevelNodes(root.left,k - 1)
                + getKLevelNodes(root.right,k - 1);
    }

二叉树叶子节点的个数

//传入一颗以root为根的二叉树,就能统计出当前这棵树的叶子结点的个数
    public int leafNodes(TreeNode root) {
        // 1.base case
        if (root == null) {
            return 0;
        }
        if (root.left == null && root.right == null) {
            return 1;
        }
        // 总的叶子结点个数 = 左子树的叶子节点个数 + 右子树的叶子结点个数
        return leafNodes(root.left) + leafNodes(root.right);
    }

二叉树的高度

    public int height(TreeNode root) {
        // 1.base case
//        if (root == null) {
//            return 0;
//        }
//        // 总高度 = 1 + Math.max(左子树高度,右子树高度)
//        return 1 + Math.max(height(root.left),height(root.right));
        return root == null ? 0 : 1 + Math.max(height(root.left),height(root.right));
    }

判断二叉树中值为val的节点是否存在

    // 在当前以root为根的二叉树中,判断值为val的元素是否存在
    public boolean contains(TreeNode root,char val) {
        // 1.base case
        if (root == null) {
            return false;
        }
        if (root.val == val) {
            return true;
        }
        return contains(root.left,val) || contains(root.right,val);
    }

继续加油!!!
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值