二叉树的基本操作

二叉树的基本操作

二叉树的前中后序遍历前面已经提过,本文中只将其LeetCode代码展示

1. 二叉树的前序遍历

LeetCode链接

public List<Integer> preorderTraversal(TreeNode root)
{
    ArrayList<Integer> list = new ArrayList<>();
    if (root == null)//如果为空直接返回
    {
        return null;
    }
    list.add(root.val);//将根节点添加到集合
    list.addAll(preorderTraversal(root.left));//将左子树添加到集合
    list.addAll(preorderTraversal(root.right));//将右子树添加到集合
    return list;
}

2. 二叉树的中序遍历

LeetCode链接

public List<Integer> preorderTraversal(TreeNode root)
{
    ArrayList<Integer> list = new ArrayList<>();
    if (root == null)//如果为空直接返回
    {
        return null;
    }
    list.addAll(preorderTraversal(root.left));//将左子树添加到集合
    list.add(root.val);//将根节点添加到集合
    list.addAll(preorderTraversal(root.right));//将右子树添加到集合
    return list;
}

3. 二叉树的后序遍历

LeetCode链接

public List<Integer> preorderTraversal(TreeNode root)
{
    ArrayList<Integer> list = new ArrayList<>();
    if (root == null)//如果为空直接返回
    {
        return null;
    }
    list.addAll(preorderTraversal(root.left));//将左子树添加到集合
    list.addAll(preorderTraversal(root.right));//将右子树添加到集合
    list.add(root.val);//将根节点添加到集合
    return list;
}

4. 求二叉树节点个数

如下图:我们想知道一个二叉树的节点个数,我们应该怎么做呢?

image-20210722160622813

由于树的定义是递归形式的,因此我们可以采用与遍历相同的方式来考虑这个问题:

我们想知道以A为根的树的节点个数,就可以算出以B为根的树的节点个数**(左子树)+以C为根的树的节点个数(右子树)+1(根)**

综上,代码如下:

public int size(TreeNode root)
    {
        if (root == null)//如果为空,直接返回0
        {
            return 0;
        }
        return size(root.left) + size(root.right) + 1;//递归:左子树节点数+右子树节点数+根节点(1)
    }

分析:

在这里插入图片描述

5. 求叶子节点个数

叶子节点定义:度为0的节点称为叶节点(如下图D、E、C均为叶子节点)

image-20210722160622813

由于树的定义是递归形式的,因此我们可以同样可以采用与递归的方式来考虑这个问题:

首先如何判断叶子节点? 如果其左右孩子均为空即是叶子节点

我们想知道叶子节点个数,就可以先算出A的孩子节点是否为叶子节点,如果不是叶子节点依次递归判断其 孩子节点的孩子节点(孙子节点),如上图所示即为D E, 是否为叶子节点.

综上,代码如下:

public int leafSize(TreeNode root)
{
    if (root == null)//如果当前节点为空,返回0
    {
        return 0;
    }
    if (root.left == null && root.right == null)//如果当前节点为叶子节点,返回1
    {
        return 1;
    }
        return leafSize(root.left) + leafSize(root.right);//否则递归判断其左右子树
}

分析:

在这里插入图片描述

6. 求第K层节点个数

image-20210722160622813

同样,本题也可用递归思路来求解,我们如果想求A为根的树的第3(k)层的节点个数,就相当于求B为根的树的第2(k-1)层的节点个数==(左子树)==+以C为根的树的第2(k-1)层的节点个数(右子树)

综上,代码如下:

public int kLevelSize(TreeNode node, int k)
{
    if (k < 1 || node == null)//如果k<1(即不合理层数)或节点为空 返回0
    {
        return 0;
    }
    if (k == 1)//如果k==1(即当前层数)返回1
    {
        return 1;
    }
    return kLevelSize(node.left, k - 1) + kLevelSize(node.right, k - 1);//递归计算左右子树第k-1层节点数
}

分析:

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值