作者:渴望力量的土狗
博客主页:渴望力量的土狗的博客主页
专栏:数据结构与算法
工欲善其事必先利其器,给大家介绍一款超牛的斩获大厂offer利器——牛客网
BinaryTree.java
import java.util.LinkedList;
import java.util.Queue;
public class BinaryTree {
static class TreeNode {
public char val;
public TreeNode left;//左孩子的引用
public TreeNode right;//右孩子的引用
public TreeNode(char val) {
this.val = val;
}
}
/**
* 创建一棵二叉树 返回这棵树的根节点
*
* @return
*/
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');
A.left=B;
A.right=C;
C.left=F;
B.left=D;
B.right=E;
return A;
}
// 前序遍历
public void preOrder(TreeNode root) {
if(root==null){
return;
}
System.out.print(root.val+" ");
preOrder(root.left);
preOrder(root.right);
}
// 中序遍历
void inOrder(TreeNode root) {
if(root==null){
return;
}
inOrder(root.left);
System.out.print(root.val+" ");
inOrder(root.right);
}
// 后序遍历
void postOrder(TreeNode root) {
if(root==null){
return;
}
postOrder(root.left);
postOrder(root.right);
System.out.print(root.val+" ");
}
public static int nodeSize;
/**
* 获取树中节点的个数:遍历思路
*/
public int size(TreeNode root) {
if(root==null){
return 0;
}
nodeSize++;
size(root.left);
size(root.right);
return nodeSize;
}
/**
* 获取节点的个数:子问题的思路
*
* @param root
* @return
*/
public int size2(TreeNode root) {
if(root==null){
return 0;
}
return size2(root.left)+size2(root.right)+1;
}
/*
获取叶子节点的个数:遍历思路
*/
public static int leafSize = 0;
public int getLeafNodeCount1(TreeNode root) {
if(root==null)return 0;
if(root.left==null&&root.right==null)
leafSize++;
getLeafNodeCount1(root.left);
getLeafNodeCount1(root.right);
return leafSize;
}
/*
获取叶子节点的个数:子问题
*/
public int getLeafNodeCount2(TreeNode root) {
if(root==null)return 0;
if(root.left==null&&root.right==null)
return 1;
return getLeafNodeCount2(root.left)+getLeafNodeCount2(root.right);
}
/*
获取第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);
}
/*
获取二叉树的高度
*/
public int getHeight(TreeNode root) {
if(root==null)return 0;
return Math.max(getHeight(root.left),getHeight(root.right))+1;
}
// 检测值为value的元素是否存在
public TreeNode find(TreeNode root, char val) {
if(root==null)return null;
if(root.val==val)return root;
if(find(root.left,val)!=null)
return find(root,val);
if(find(root.right,val)!=null)
return find(root.right,val);
return null;
}
//层序遍历
public void levelOrder(TreeNode root) {
if(root==null)return;
Queue<TreeNode>qu=new LinkedList<>();
qu.offer(root);
while(!qu.isEmpty()){
TreeNode cur=qu.poll();
System.out.print(cur.val+" ");
if(cur.left!=null)
qu.offer(cur.left);
if(cur.right!=null)
qu.offer(cur.right);
}
}
// 判断一棵树是不是完全二叉树
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;
}
}
Test.java
public class Test {
public static void main(String[] args) {
BinaryTree binaryTree=new BinaryTree();
binaryTree.preOrder(binaryTree.createTree());
System.out.println();
binaryTree.inOrder(binaryTree.createTree());
System.out.println();
binaryTree.postOrder(binaryTree.createTree());
System.out.println();
System.out.println(binaryTree.size(binaryTree.createTree()));
System.out.println(binaryTree.size2(binaryTree.createTree()));
System.out.println(binaryTree.getLeafNodeCount1(binaryTree.createTree()));
System.out.println(binaryTree.getLeafNodeCount2(binaryTree.createTree()));
System.out.println(binaryTree.getKLevelNodeCount(binaryTree.createTree(), 3));
System.out.println(binaryTree.getHeight(binaryTree.createTree()));
System.out.println("=========================");
binaryTree.levelOrder(binaryTree.createTree());
System.out.println(binaryTree.isCompleteTree(binaryTree.createTree()));
}
}
测试结果: