二叉树的基本操作
二叉树的前中后序遍历前面已经提过,本文中只将其LeetCode代码展示
1. 二叉树的前序遍历
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. 二叉树的中序遍历
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. 二叉树的后序遍历
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](https://i-blog.csdnimg.cn/blog_migrate/89631c82bd9ba088161e6b5644002c7d.png)
由于树的定义是递归形式的,因此我们可以采用与遍历相同的方式来考虑这个问题:
我们想知道以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](https://i-blog.csdnimg.cn/blog_migrate/89631c82bd9ba088161e6b5644002c7d.png)
由于树的定义是递归形式的,因此我们可以同样可以采用与递归的方式来考虑这个问题:
首先如何判断叶子节点? 如果其左右孩子均为空即是叶子节点
我们想知道叶子节点个数,就可以先算出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](https://i-blog.csdnimg.cn/blog_migrate/89631c82bd9ba088161e6b5644002c7d.png)
同样,本题也可用递归思路来求解,我们如果想求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层节点数
}
分析: