在一棵二叉树中,如果我们需要获取树中结点的个数
用代码如何实现呢 我们首先就想到通过遍历去找,每遍历一个Size就加1,直到遍历结束 ,这是最简单粗暴的方法 但是还有一种方法,通过子问题的思想去做这道题 其实更好理解 就是树的结点就是左子树的结点加上右子树的结点 不多说 兄弟们直接上代码
//获取树中结点的个数
public static int nodeSize;
public void size(TreeNode root){
if (root == null){
return;
}
nodeSize++;
size(root.left);
size(root.right);
}
//也可以利用子问题的思想去解决
public int size2(TreeNode root){
if (root == null){
return 0;
}
int tmp = size2(root.left)+size2(root.right);
return tmp;
}
当然如果树为空就不需要再去遍历了 ,直接就返回来
首先我们得明白什么是叶子结点 ,就是左子树和右子树都为null的结点 也就是说该结点的度为0。了解完这个之后,相信兄弟们心中一定有了思路 大喊一声 :遍历!!! 不错 暴力解法就是遍历 简单又好想;但我们通过上一道题的思路也可以想到用子问题的思路去解决该问题。一棵树正常来说都有左子树和右子树吧 那么树的叶子结点的个数也就可以通过去找树的左子树的叶子结点和右子树的叶子结点的个数 加起来就是树的叶子结点了吧 !到这里 我们直接上代码!
//获取叶子结点的个数
public int leafSize;
public void getLeafNode(TreeNode root){
if (root == null){
return;
}
if (root.left == null && root.right == null){
leafSize++;
}
getLeafNode(root.left);
getLeafNode(root.right);
}
//同样可以用子问题的思想去解决 左子树的叶子结点和右子树的叶子结点相加就行
public int getNodeSize2(TreeNode root){
if (root == null){
return 0;
}
if (root.left == null && root.right == null){
return 1;
}
return getNodeSize2(root.left)+getNodeSize2(root.right);
}
这个操作其实也是一样用到递归 上两道题也在用递归 ,你会发现树离不开递归。假设你要求一棵树的第3层,你是不是从树的根开始 不为空就继续递归树的左子树和右子树 直到k ==1 就返回一个1 ,每递归一次,他的k值就减1 这大家能理解吧 相信看完代码,大家就能更深刻的理解。
//求树的第K层有几个结点
public int getKLevelNodeCount(TreeNode root,int k){
if (root == null){
return 0;
}
if (k == 1){
return 1;
}
return getKLevelNodeCount(root.left,k-1)+getKLevelNodeCount(root.right,k-1);
}
所谓高度就是树有多少层 有时候树的左子树的层数多 有时候树的右子树的层数多 这我们就需要比较树的左右子树 但是一定要记得加1 因为加1是为了我们递归左子树和右子树时需要包括根结点。 上代码
//求树的高度
public int getHeight(TreeNode root){
if(root == null){
return 0;
}
int leftHeight = getHeight(root.left);
int rightHeight = getHeight(root.right);
//比较左子树和右子树的高度 取最高的再加1 就是树的高度
return Math.max(leftHeight,rightHeight)+1;
}
//还有一种使用三目运算符
public int getHeight2(TreeNode root){
if (root == null){
return 0;
}
int leftHeight = getHeight2(root.left);
int rightHeight = getHeight2(root.right);
return (leftHeight > rightHeight ? leftHeight:rightHeight)+1;
}
这个就时一个一个去遍历递归
相符就返回
没有就返回null
//找Value值是否存在
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;
}
}
讲到这里 我们可以去尝试几个OJ题
比如如何判断两棵树是相同的树 也就是说左子树和右子树都要相同 顺序不能调换
这道题的链接就放在这里 相同的树
大家可以去试试
首先我们要判断两棵树是否相同 就得明白这两棵树每个结点的值和顺序都要一样
直接上代码
class Solution {
public boolean isSameTree(TreeNode p, TreeNode q) {
//如果结构不相同 一个为空 一个不为空 那一定不是相同树
if(p != null && q == null || p == null && q != null){
return false;
}
if(p == null && q == null){
return true;
}
else if(p.val != q.val){
return false;
}
//到这就说明相同了 根 继续判断左右子树
return isSameTree(p.left, q.left) && isSameTree(p.right,q.right);
}
}
首先要判断这两棵树的结构是否相同,相同再去判断值
还有两道题大家可以去尝试一下 小编把链接放在这里 不会可以私信问 互相学习 小编饿了去干个饭 哈哈
另一棵树的子树
翻转二叉树