网上的算法大多数是c语言的,Java对与树的操作比较少,都是指针操作,所以Java也可以实现。
网上的要么是一边输入一边构建,要么是手动insert,个人感觉不是一种特别好的写法。我这里用的是字符串构建,以‘#’分割。
本文主要是二叉树的构建,没有太多关于二叉树的操作,思路比较简单,故不做算法逻辑介绍。
二叉树结构类
public class BinaryTreeNode {
char value;
BinaryTreeNode left;
BinaryTreeNode right;
BinaryTreeNode() {}
BinaryTreeNode(BinaryTreeNode left, BinaryTreeNode right){
this.left = left;
this.right = right;
}
}
二叉树操作接口类
/**
* @author: wbb
* @date 2022/2/23 3:02 下午
*/
public interface BinaryTreeOperate {
public BinaryTreeNode createTree(BinaryTreeNode node, char[] chars);
public void preOrderTraverse(BinaryTreeNode node);
public void inOrderTraverse(BinaryTreeNode node);
public void postOrderTraverse(BinaryTreeNode node);
}
二叉树操作实现类
/**
* @author: wbb
* @date 2022/2/23 3:04 下午
*/
public class BinaryTreeOperateImpl implements BinaryTreeOperate{
int i = 0;
@Override
public BinaryTreeNode createTree(BinaryTreeNode node, char[] chars) {
if(chars[i] == '#'){
node = null;
i ++;
} else{
if(i != 0){
node = new BinaryTreeNode();
}
node.value = chars[i];
i ++;
node.left = createTree(node.left, chars);
node.right = createTree(node.right, chars);
}
return node;
}
@Override
public void preOrderTraverse(BinaryTreeNode node) {
if(node == null){
return;
}
System.out.println(node.value);
preOrderTraverse(node.left);
preOrderTraverse(node.right);
}
@Override
public void inOrderTraverse(BinaryTreeNode node) {
if(node == null){
return;
}
preOrderTraverse(node.left);
System.out.println(node.value);
preOrderTraverse(node.right);
}
@Override
public void postOrderTraverse(BinaryTreeNode node) {
if(node == null){
return;
}
preOrderTraverse(node.left);
preOrderTraverse(node.right);
System.out.println(node.value);
}
}
main,这里只展示调用的关键代码
BinaryTreeNode node = new BinaryTreeNode();
BinaryTreeOperate operate = new BinaryTreeOperateImpl() ;
char[] chars = {'a','b','#','d','#','#','c','#','#'};
operate.createTree(node, chars);
operate.preOrderTraverse(node);
输出