二叉树的建立
输入描述:
第一行一个数字 n 表示二叉树的总结点数。以下 n 行每行三个整数 fa lch rch,表示节点 fa 的左儿子节点为 lch,右儿子节点为 rch。(若 lch 为 0 则表示 fa 没有左儿子,rch同理)
第一行的 fa 为根节点。
ps:节点的标号就是节点的值。
输出描述:
在给定的函数中返回双向链表的头指针。
示例1
输入
9
6 4 7
4 2 5
2 1 3
5 0 0
1 0 0
3 0 0
7 0 9
9 8 0
8 0 0
建立方法一:递归
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
br.readLine();
TreeNode root = createTree(br);
}
/**
* 递归建树
*
* @param br
* @return
*/
public static TreeNode createTree(BufferedReader br) {
try {
String[] split = br.readLine().split(" ");
int[] data = new int[split.length];
for (int i = 0; i < data.length; i++) {
data[i] = Integer.parseInt(split[i]);
}
TreeNode node = new TreeNode(data[0]);
if (data[1] != 0) {
node.left = createTree(br);
}
if (data[2] != 0) {
node.right = createTree(br);
}
return node;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
建立方法二:利用无重复节点且书中节点值范围一定
public class Main{
public static void main(String[] args) throws Exception{
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(reader.readLine());
int[][] a = new int[n+1][2];
String[] ss = reader.readLine().split(" ");
int root = Integer.parseInt(ss[0]);
a[root][0] = Integer.parseInt(ss[1]);
a[root][1] = Integer.parseInt(ss[2]);
int t;
for (int i=1;i<n;i++){
String[] sts = reader.readLine().split(" ");
t = Integer.parseInt(sts[0]);
a[t][0] = Integer.parseInt(sts[1]);
a[t][1] = Integer.parseInt(sts[2]);
}
TreeNode rootNode = new TreeNode(root);
createTree(rootNode,a);
}
public static void createTree(TreeNode root,int[][] a){
if(root==null){
return ;
}
int i=root.val;
int l=a[i][0];
int r=a[i][1];
if(l!=0){
TreeNode leftNode=new TreeNode(l);
root.left=leftNode;
leftNode.parent=root;
createTree(leftNode,a);
}
if(r!=0){
TreeNode rightNode=new TreeNode(r);
root.right=rightNode;
rightNode.parent=root;
createTree(rightNode,a);
}
}