二叉树的基本操作以及一些二叉树相关例题

目录

1,获取树中节点的个数

2,获取叶子节点的个数

3,获取叶子节点的个数(2)

4,获取第K层节点的个数

5,获取二叉树的高度

6,检测值为value的元素是否存在

例题1:相同的树问题

例题2:另一棵树的子树问题

例题3:翻转二叉树

例题4:对称二叉树

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:相同的树问题

100. 相同的树 - 力扣(LeetCode)

这个例题需要首先考虑的是根的三种情况

第一种是一个为空一个不为空,则不是两个相同的树。

第二种是如果两个都为空,则是相同的树。

第三种是两个都不为空,值不一样,不是两课相同的树。

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:另一棵树的子树问题

572. 另一棵树的子树 - 力扣(LeetCode)

这个题首先我们考虑他们是否相同,可以利用例题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:翻转二叉树

226. 翻转二叉树 - 力扣(LeetCode)

这个题需要找一个临时变量,然后进行交换。

 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:对称二叉树

101. 对称二叉树 - 力扣(LeetCode)

这个题我们首先进行结构上的判断,首先判断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);


    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值