二叉树实现
package data_structure;
import java.util.Random;
class TreeNode {
public int val;
public TreeNode LefttreeNode;
public TreeNode RighttreeNode;
}
public class TreeApp {
public static int k = 0;
static Random random = new Random();
//随机生成一个二叉树
public static TreeNode creatTree() {
int temp = random.nextInt(100);
if (temp > 50) {
TreeNode treeNode = new TreeNode();
treeNode.val = temp;
treeNode.LefttreeNode = creatTree();
treeNode.RighttreeNode = creatTree();
return treeNode;
}
return null;
}
//先序遍历
public static void preorder(TreeNode treeNode) {
if (treeNode != null) {
System.out.println(treeNode.val);
preorder(treeNode.LefttreeNode);
preorder(treeNode.RighttreeNode);
}
}
//中序遍历
public static void inorder(TreeNode treeNode) {
if (treeNode != null) {
preorder(treeNode.LefttreeNode);
System.out.println(treeNode.val);
preorder(treeNode.RighttreeNode);
}
}
//后序遍历
public static void postorder(TreeNode treeNode) {
if (treeNode != null) {
preorder(treeNode.LefttreeNode);
preorder(treeNode.RighttreeNode);
System.out.println(treeNode.val);
}
}
//求节点个数 递归统计左右子树节点个数
public static int count(TreeNode treeNode) {
if (treeNode == null) {
return 0;
} else {
int countLeft = count(treeNode.LefttreeNode);
int countRight = count(treeNode.RighttreeNode);
return countLeft + countRight + 1;
}
}
//求节点个数 利用公共参数,将树遍历一遍
public static void count2(TreeNode treeNode) {
if (treeNode != null) {
k++;
count2(treeNode.LefttreeNode);
count2(treeNode.RighttreeNode);
}
}
//求叶子节点个数
public static int leafcount(TreeNode treeNode) {
if (treeNode == null) {
return 0;
} else {
int leafCountLeft = leafcount(treeNode.LefttreeNode);
int leafCountRight = leafcount(treeNode.RighttreeNode);
if (treeNode.RighttreeNode == null && treeNode.LefttreeNode == null) {
return leafCountLeft + leafCountRight + 1;
} else {
return leafCountLeft + leafCountRight;
}
}
}
//求叶子节点个数,利用公共参数求
public static void leafcount2(TreeNode treeNode) {
if (treeNode != null) {
if (treeNode.RighttreeNode == null && treeNode.LefttreeNode == null) {
k++;
}
leafcount2(treeNode.LefttreeNode);
leafcount2(treeNode.RighttreeNode);
}
}
//求二叉树高度
public static int high(TreeNode treeNode) {
if (treeNode == null) {
return 0;
} else {
int highLeft = high(treeNode.LefttreeNode);
int highRight = high(treeNode.RighttreeNode);
return highLeft > highRight ? 1 + highLeft : 1 + highRight;
}
}
//非递归打印最后一个节点的值
public static int printLastNode(TreeNode treeNode){
TreeNode treeNode_temp = treeNode;
while (treeNode_temp.LefttreeNode!=null||treeNode_temp.RighttreeNode!=null){
if (treeNode_temp.RighttreeNode==null){
treeNode_temp = treeNode_temp.LefttreeNode;
}else {
treeNode_temp = treeNode_temp.RighttreeNode;
}
}
return treeNode_temp.val;
}
public static void main(String[] args) {
//创建二叉树
TreeNode header = new TreeNode();
header.LefttreeNode = creatTree();
header.RighttreeNode = creatTree();
//遍历
preorder(header);
System.out.println("\n叶子节点个数" + leafcount(header));
leafcount2(header);
System.out.println("\n叶子节点个数" + k);
System.out.println("\n" + high(header));
System.out.println("\n最后一个节点的值为"+printLastNode(header));
}
}