目录
0.搭建二叉树
先搭建一个简易的二叉树
基于上图搭建的二叉树
public class TestBinaryTree {
public class TreeNode {
public char val;
public TreeNode left;//左孩子
public TreeNode right;//右孩子
public TreeNode(char val) {
this.val = val;
}
}
public TreeNode createTree() {
TreeNode A = new TreeNode('A');
TreeNode B = new TreeNode('B');
TreeNode C = new TreeNode('C');
TreeNode D = new TreeNode('D');
TreeNode E = new TreeNode('E');
TreeNode F = new TreeNode('F');
TreeNode G = new TreeNode('G');
TreeNode H = new TreeNode('H');
A.left = B;
A.right = C;
B.left = D;
B.right = E;
C.left = F;
C.right = G;
E.right = H;
return A;
}
1.获取树中节点的个数
// 获取树中节点的个数
public static int nodeSize = 0;
public int size(TreeNode root) {
if (root == null) {
return 0;
}
nodeSize++;
size(root.left);
size(root.right);
return nodeSize;
}
创建一个计数器nodeSize,然后前序遍历代码,只要不为空,计数器就加一,一直到整个二叉树遍历完,返回的结果就是二叉树的节点的个数。
public class Test {
public static void main(String[] args) {
TestBinaryTree testBinaryTree = new TestBinaryTree();
TestBinaryTree.TreeNode root = testBinaryTree.createTree();
testBinaryTree.size(root);
System.out.println("节点个数" + TestBinaryTree.nodeSize);
}
}
2.获取叶子节点的个数
// 获取叶子节点的个数
int getLeafNodeCount(TreeNode root) {
if(root == null){
return 0;
}
if(root.left == null && root.right == null){
return 1;
}
return getLeafNodeCount(root.left)+getLeafNodeCount(root.right);
}
判断root是否为空,不为空进入他的左子树和右子树,因为叶子结点是没有左子树和右子树的。所以他们为空,就返回1,最后把这些加起来,就是叶子结点的个数。
//测试代码,叶子结点为4
System.out.println("叶子结点个数"+testBinaryTree.getLeafNodeCount(root));
3.获取第K层节点的个数
public int getKLevelNodeCount(TreeNode root, int k) {
if (root == null || k <= 0) {
return 0;
}
if (k == 1) {
return 1;
}
return getKLevelNodeCount(root.left, k - 1) + getKLevelNodeCount(root.right, k - 1);
}
需要先获取k,然后一直k--,直到k=1.
先判断root是否为空,并且k的位置是否合法,如果k到了指定的层数,就返回1,不对就继续往下走。
测试代码
System.out.println("第K层结点的个数"+testBinaryTree.getKLevelNodeCount(root,2));
4.获取二叉树的高度
要求二叉树的最高高度,就需要分别求左子树的最高高度和右子树的最高高度,他们最高的高度加1得到的就是二叉树的最高高度。
public int getHeight(TreeNode root) {
if (root == null) {
return 0;
}
int leftHeight = getHeight(root.left);
int rightHeight = getHeight(root.right);
return leftHeight > rightHeight ? leftHeight + 1 : rightHeight + 1;
}
测试代码
System.out.println("二叉树的高度为:"+ testBinaryTree.getHeight(root));
5.检测值为value的元素是否存在
解题思路就是:遍历二叉树,找到value
1.判断根节点
2.判断左子树
3.判断右子树
4.不存在你要找的节点
public TreeNode find(TreeNode root, char val) {
if (root == null) {
return null;
}
//判断根
if (root.val == val) {
return root;
}
//找左子树
TreeNode ret1 = find(root.left, val);
if (ret1 != null) {
return ret1;
}
//找右子树
TreeNode ret2 = find(root.right, val);
if (ret2 != null) {
return ret2;
}
//没找到
return null;
}
6.层序遍历
使用队列来做,二叉树入队列,每次弹出的数据,cur都存
public void levelOrder(TreeNode root) {
if(root == null) return;
Queue<TreeNode> qu = new LinkedList<>();
//队列里面装二叉树
qu.offer(root);
//如果队列不为空,就把数据弹出,cur每次都接受
while (!qu.isEmpty()){
TreeNode cur = qu.poll();
System.out.print(cur.val+" ");
//如果cur的左和右不为空,队列就弹出
if(cur.left != null){
qu.offer(cur.left);
}
if(cur.right != null){
qu.offer(cur.right);
}
}
}
测试代码
System.out.println("层序遍历:");
testBinaryTree.levelOrder(root);
7.判断一棵树是不是完全二叉树
思路和上一个差不多,也是使用队列来做,二叉树入队列,每次弹出的数据,cur都存,只不过这次空的二叉树以null的形式进入队列,当cur接收到nul的时候,队列停止弹出,开始检查队列,如果里面都是null,即为完全二叉树,反之则不是
public boolean isCompleteTree(TreeNode root) {
if (root == null) return true;
Queue<TreeNode> qu = new LinkedList<>();
qu.offer(root);
while (!qu.isEmpty()) {
TreeNode cur = qu.poll();
if (cur != null) {
qu.offer(cur.left);
qu.offer(cur.right);
} else {
break;
}
}
while (!qu.isEmpty()) {
TreeNode pop = qu.poll();
if (pop != null) {
return false;
}
}
return true;
}
当前代码如果不屏蔽E的分支H,就是false,屏蔽就是true
测试代码
System.out.println(testBinaryTree.isCompleteTree(root));
感谢观看