目录
1,获取树中节点的个数
public int nodeSize;
public void size(TreeNode root){
if(root==null){
return;
}
nodeSize++;
size(root.left);
size(root.right);
};
2,获取叶子节点的个数
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);
};
3,获取叶子节点的个数(2)
public int getLeafNodeCount1(TreeNode root)
{
if(root==null){
return 0;
}
if(root.left==null&&root.right==null){
return 1;
}
return getLeafNodeCount1(root.left)+getLeafNodeCount1(root.right);
};
4,获取第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);
};
5,获取二叉树的高度
public int getHeight(TreeNode root){
if(root==null){
return 0;
}
int leftSize =getHeight(root.left);
int rightSize=getHeight(root.right);
return Math.max(leftSize,rightSize)+1;
};
6,检测值为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;
};
例题1:相同的树问题
这个例题需要首先考虑的是根的三种情况
第一种是一个为空一个不为空,则不是两个相同的树。
第二种是如果两个都为空,则是相同的树。
第三种是两个都不为空,值不一样,不是两课相同的树。
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;
}
if(p.val!=q.val){
return false;
}
return isSameTree(p.left,q.left)&&isSameTree(p.right,q.right);
}
}
例题2:另一棵树的子树问题
这个题首先我们考虑他们是否相同,可以利用例题1的方法进行判断,第二种情况就是左边的是它的左子树,第三种情况就是右边的是它的右子树。
public boolean isSubtree(TreeNode root, TreeNode subRoot) {
if(root==null){
return false;
}
if(isSameTree(root,subRoot)){
return true;
}
if(isSubtree(root.left,subRoot)){
return true;
}
if(isSubtree(root.right,subRoot)){
return true;
}
return false;
}
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;
}
if(p.val!=q.val){
return false;
}
return isSameTree(p.left,q.left)&&isSameTree(p.right,q.right);
}
例题3:翻转二叉树
这个题需要找一个临时变量,然后进行交换。
public TreeNode invertTree(TreeNode root) {
if(root==null){
return null;
}
invertTree(root.left);
invertTree(root.right);
TreeNode tmp=root.left;
root.left=root.right;
root.right=tmp;
return root;
}
例题4:对称二叉树
这个题我们首先进行结构上的判断,首先判断root节点是否为空,如果为空返回true,然后判断左右子树的节点,首先看左右子树是否为空,然后判断左右子树的值。
public boolean isSymmetric(TreeNode root) {
if(root==null){
return true;
}
return isSymmetricChild(root.left,root.right);
}
public boolean isSymmetricChild(TreeNode leftTree,TreeNode rightTree){
if(leftTree==null&&rightTree!=null||leftTree!=null&&rightTree==null){
return false;
}if(leftTree==null&&rightTree==null){
return true;
}
if(leftTree.val!=rightTree.val){
return false;
}return isSymmetricChild(leftTree.left,rightTree.right)&&
isSymmetricChild(leftTree.right,rightTree.left);
}