创建二叉树时使用的是扩展二叉树,即将叶子节点的孩子补成#,用作标记,如下所示:
在以前序方式创建二叉树的时候需要输入:ab#d##c#e##。
class TreeNode {
char data;
TreeNode left;
TreeNode right;
}
public class Tree {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
String str=scanner.nextLine();
Queue queue=new LinkedList<>();
for(int i=0;i<str.length();i++) {
queue.offer(str.charAt(i));
}
TreeNode root=createBinaryTree(queue);
System.out.print("前序遍历:");
print_preTree(root);
System.out.print("\n中序遍历:");
print_midTree(root);
System.out.print("\n后序遍历:");
print_postTree(root);
System.out.print("\n层次遍历:");
print_levelTree(root);
}
/**
* 创建二叉树,前序方式
* @return
*/
static TreeNode createBinaryTree(Queue queue) {
TreeNode node;
char ch=(char)queue.poll();
if(ch=='#') {
node=null;
}
else {
node=new TreeNode();
node.data=ch;
node.left=createBinaryTree(queue);
node.right=createBinaryTree(queue);
}
return node;
}
/**
* 递归实现二叉树前序遍历
* @param node
*/
static void print_preTree(TreeNode node) {
if(node!=null) {
System.out.print(node.data);
print_preTree(node.left);
print_preTree(node.right);
}
}
/**
* 递归实现二叉树中序遍历
* @param node
*/
static void print_midTree(TreeNode node) {
if(node!=null) {
print_midTree(node.left);
System.out.print(node.data);
print_midTree(node.right);
}
}
/**
* 递归实现二叉树后序遍历
* @param node
*/
static void print_postTree(TreeNode node) {
if(node!=null) {
print_postTree(node.left);
print_postTree(node.right);
System.out.print(node.data);
}
}
/**
* 二叉树层次遍历
* @param node
*/
static void print_levelTree(TreeNode node) {
if(node!=null) {
Queue<TreeNode> nodeQueue=new LinkedList<TreeNode>();
nodeQueue.offer(node);
while(!nodeQueue.isEmpty()) {
TreeNode treeNode=nodeQueue.poll();
System.out.print(treeNode.data);
if(treeNode.left!=null) {
nodeQueue.offer(treeNode.left);
}
if(treeNode.right!=null) {
nodeQueue.offer(treeNode.right);
}
}
}
}
}