二叉树的分类和比较

二叉树的分类和比较

二叉树的分类
满二叉树

所有叶子节点都在同一层 所有分支节点(非叶子节点)都有左右子树

每一层的节点个数 (i表示层数) 2^(i-1)个节点
对于深度为h的树,共有节点 2^h - 1

image-20201014115045999
斜树

所有的子节点都向一个方向倾斜,只分叉出左子树或右子树

image-20201014115100787

完全二叉树

​ 对于高度/深度为h的二叉树而言,h-1层都是满的,h层节点在左侧连续排列,空位都在右侧。

​ 满二叉树一定是完全二叉树,反之未必。

image-20201014115115823 image-20201014135510002

将完全二叉树的节点进行编号,对于编号为k的节点:

1) 父节点就是 k/2
2) 如果有孩子节点,先有左孩子 2k,后有右孩子 2k+1

【构造出完全二叉树】

    //                            0 1 2 3 4
    //                             2k+1 2k+2
    private static int[] array = {1, 2, 3, 4, 5};
    // 存储生成的节点
    private static List<TreeNode> nodeList = new LinkedList<>();

    public static TreeNode createTree() {
        // 构造节点
        for (int i = 0; i < array.length; i++) {
            TreeNode node = new TreeNode(array[i]);
            nodeList.add(node);
        }

        // 构造节点之间的关系
        for (int i = 0; i < nodeList.size() / 2; i++) {
            TreeNode node = nodeList.get(i);
            node.left = nodeList.get(i * 2 + 1);

            // 最后一个父节点  可能没有右孩子  需要额外判断
            if (i * 2 + 2 < nodeList.size()) {
                node.right = nodeList.get(i * 2 + 2);
            }

        }
        return nodeList.get(0);
    }

【相同的树】

https://leetcode-cn.com/problems/same-tree/

  1. 相同的树
    给定两个二叉树,编写一个函数来检验它们是否相同。

如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。

示例 1:

输入: 1 1
/ \ /
2 3 2 3

[1,2,3], [1,2,3]

输出: true
示例 2:

输入: 1 1
/
2 2

[1,2], [1,null,2]

输出: false
示例 3:

输入: 1 1
/ \ /
2 1 1 2

[1,2,1], [1,1,2]

输出: false

如何判断是否相同?

1)两棵树,如果有左右子树,树A的左子树树B的左子树,同时树A的右子树树B的右子树
2)如果两棵树都是空,是相同的
3)如果一棵为空,一棵不为空,是不同的
4)如果数值不同,也是不同的

    public boolean isSameTree(TreeNode p, TreeNode q) {
        // 递归出口
        if (p == null && q == null) {
            return true;
        }

        if (p == null || q == null) {
            return false;
        }

        if (p.val != q.val) {
            return false;
        }

        // 递归规律
        return isSameTree(p.left, q.left)
                && isSameTree(p.right, q.right);
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值