如何创建一颗二叉树
-
如何创建
① 空树也是一棵二叉树,所以要考虑这种情况
② 非空:根节点–》根节点的左子树–》根节点的右子树===》
二叉树的创建方式:
按照概念进行创建–》创建根节点–》创建根节点的左右子树(由于左右子树也是二叉树,所以可以通过递归的方式创建) -
节点中的数据序列如何提供?
二叉树的创建规则–》类似于二叉树的前序遍历规则,只不过把里面的遍历操作改成创建节点的操作
但是注意如果按照前序序列ABDECF创建的话,在创建过程中不知道节点是否有子树—这样创建出来的就是一颗左单只的二叉树
所以创建是给的序列应该时[1 2 3 # # # 4 5 # # 6]
二叉树创建并遍历
编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。 例如如下的先序遍历字符串: ABC##DE#G##F### 其中“#”表示的是空格,空格字符代表空树。建立起此二叉树以后,再对二叉树进行中序遍历,输出遍历结果。
import java.util.Scanner;
/*
* 编一个程序,读入用户输入的一串先序遍历字符串,
* 根据此字符串建立一个二叉树(以指针方式存储)。
* 例如如下的先序遍历字符串: ABC##DE#G##F###
* 其中“#”表示的是空格,空格字符代表空树。
* 建立起此二叉树以后,再对二叉树进行中序遍历,输出遍历结果。
* */
class TreeNode{
TreeNode left = null;
TreeNode right = null;
char val = 0;
public TreeNode(char val) {
this.val = val;
}
}
class BinTree {
private TreeNode root = null;
int i = 0;
// 前序遍历的字符串s和s中代表空树的字符invalid
BinTree(String s, char invalid) {
root = createBT(s, invalid);
}
// 递归创建二叉树
public TreeNode createBT(String s, char invalid) {
//int i = 0; 不能放在这里
TreeNode newRoot = null;
if (i < s.length() && s.charAt(i) != invalid) {
newRoot = new TreeNode(s.charAt(i));
i++;
newRoot.left = createBT(s, invalid);
i++;
newRoot.right = createBT(s, invalid);
}
return newRoot;
}
// 中序遍历
public void inOrder(){
// root在BTtree里面才有,所以外部调用的时候无法传参,所以加一个无参的方法
inOrder(root);
System.out.println();
}
public void inOrder(TreeNode root){
if(null == root){
return;
}
inOrder(root.left);
System.out.print(root.val + " ");
inOrder(root.right);
}
}
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(sc.hasNextLine()){
String s = sc.nextLine();
BinTree bt = new BinTree(s,'#');
bt.inOrder();
}
}
}