前文对二叉树的递归遍历作了一定的介绍,本文中我们继续深入理解递归,实现二叉树的基本操作。
对于这个问题,我们有两种解决的思路。
我们通过结点左字树和右字树的结点总数加1来计算总结点数,而左右子树又可以通过这个方法来拆分成求子树的子树的结点总数的问题,直到遇到叶子结点,递进过程结束,开始回归。代码如下:
public int size(TreeNode root) {
if(root == null) {
return 0;
}
return size2(root.left) + size2(root.right)+1;
}
设置非成员变量nodeSize来计数吗,遇到结点就让nodeSize自增。
public static int nodeSize;
public void size(TreeNode root) {
if(root == null) {
return;//空树是不需要遍历的
}
nodeSize++;
size(root.left);
size(root.right);
}
相信通过对以上递归的理解,可以想出如何获取叶子结点的个数。唯一需要注意的是。叶子结点的判断条件:左孩子引用与右孩子引用为空。
public int leafSize;
public void getLeafNodeCount(TreeNode root) {
if(root == null) {
return;
}
if(root.left == null && root.right == null) {
leafSize++;
}
getLeafNodeCount(root.left);
getLeafNodeCount(root.right);
}
这个题目相对于上面的题目,参数多了一个k,因此,在递归时,要考虑传入的是k经变化后的值。同时,递归的条件也要发生改变,应该当k的值为1时,停止递进。代码如下:
public int getKLevelNodeCount(TreeNode root,int k) {
if(root == null) {
return 0;
}
if(k == 1) {
return 1;//就是当前结点,个数为1
}
return getKLevelNodeCount(root.left,k-1)+
getKLevelNodeCount(root.right,k-1);//向下推移1层,k--
}
对于这个问题,我们也是利用这个方法的自调用,利用递归实现。值得思考的是,二叉树的高度由最下层的结点的高度决定,因此我们要取出左右子树中深度中的较大值,再加上1(根结点)得到二叉树的高度。
public int getHeight(TreeNode root) {
if(root == null) {
return 0;
}
int leftHeight = getHeight(root.left);
int rightHeight = getHeight(root.right);
return Math.max(leftHeight,rightHeight) + 1;
}
查找十分简单,按照根左右顺序递归查找即可。
public TreeNode find(TreeNode root,int val) {
if(root == null) return null;
if(root.val == val) return root;
TreeNode leftVal = find(root.left,val);
if(leftVal != null) {
return leftVal;
}
TreeNode rightVal = find(root.right,val);
if(rightVal != null) {
return rightVal;
}
return null;
}