学习作业记录
创建一个二叉树,结点存放的是整型数据,遵循的规则是:第一个数值作为二叉树的树根,小于父节点的值放在左子节点,大于父节点的值放在右子节点。 在创建好二叉树的基础之上,进行查询,通过输入的要查询的值,找出它双亲结点、孩子结点、兄弟结点。 输出二叉树的前序、中序、后序遍历结果。
输入格式:
输入数值为整型,多行输入。 第一行:二叉树的结点个数。 第二行:结点的值,以逗号间隔。 第三行:要查询的结点值。
输出格式:
第一行输出要查询的结点的双亲结点。 第二行输出要查询的结点的孩子结点。 第三行输出兄弟结点。 第四行为二叉树前序遍历结果。 第五行为二叉树中序遍历结果。 第六行为二叉树后序遍历结果。
输入样例:
在这里给出一组输入。例如:
8
5,2,9,11,4,23,10,16
23
输出样例:
在这里给出相应的输出。例如:
23的双亲是11
23的左孩子是16无右孩子
23的兄弟是10
前序结果5,2,4,9,11,10,23,16
中序结果2,4,5,9,10,11,16,23
后序结果4,2,10,16,23,11,9,5
输入样例2:
在这里给出一组输入。例如:
1
7
7
输出样例2:
在这里给出相应的输出。例如:
7无双亲
7无孩子
7无兄弟
前序结果7
中序结果7
后序结果7
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
String str = sc.next();
String[] s = str.split(",");
int[] a = new int[num];
for (int i = 0; i < num; i++) {
a[i]=Integer.parseInt(s[i]);
}
int x=sc.nextInt();
BinaryTree b=new BinaryTree(a,num,x);
}
}
class TreeNode{
int value;
TreeNode parent;
TreeNode left;
TreeNode right;
TreeNode bro;
public TreeNode(int value){
this.value=value;
this.parent=null;
this.left=null;
this.right=null;
}
}
class BinaryTree{
public TreeNode rootNode;
public BinaryTree(int[]data,int num,int x){
for (int i=0;i<num;i++){
addNode(data[i]);
}
searchNode(rootNode,x);
int count =0;
System.out.print("前序结果");
PreOrder(rootNode);
System.out.println();
System.out.print("中序结果");
InOrder(rootNode,count);
System.out.println();
System.out.print("后序结果");
PostOrder(rootNode);
}
void addNode(int value){
TreeNode currentNode=rootNode;
if(rootNode==null){
rootNode=new TreeNode(value);
return;
}
while(true){
if(value<currentNode.value){
if(currentNode.left==null){
currentNode .left=new TreeNode(value);
currentNode.left.parent=currentNode;
return;
}else
currentNode =currentNode.left;
}else{
if(currentNode.right==null){
currentNode.right=new TreeNode(value);
currentNode.right.parent=currentNode;
return;
}else
currentNode =currentNode.right ;
}
}
}
public void searchNode(TreeNode node,int x) {
while (true) {
if (x < node.value) {
node = node.left;
} else if (x > node.value) {
node = node.right;
} else if (x == node.value) {
if (node.parent == null)
System.out.println(x + "无双亲");
else
System.out.println(x + "的双亲是" + node.parent.value);
if (node.left == null && node.right == null) {
System.out.println(x + "无孩子");
} else {
if (node.left == null)
System.out.println(x + "无左孩子右孩子是" + node.right.value);
else if (node.right == null) {
System.out.println(x + "的左孩子是" + node.left.value + "无右孩子");
} else
System.out.println(x + "的左孩子是" + node.left.value + "右孩子是" + node.right.value);
}
if(node.parent==null||node.parent.left==null||node.parent.right==null){
System.out.println(x+"无兄弟");
}else{
if(node.parent.right==node){
System.out.println(x+"的兄弟是"+node.parent.left.value);
}else
System.out.println(x+"的兄弟是"+node.parent.right.value);
}
break;
}
}
}
public void PreOrder(TreeNode node){
if(node!=null){
if(node==rootNode){
System.out.print(node.value);
}else
System.out.print(","+node.value);
PreOrder(node.left);
PreOrder(node.right);
}
}
public void InOrder(TreeNode node,int count ){
if(node!=null){
InOrder(node.left,count);
if(count==0&&node.left==null){
System.out.print(node.value);
count++;
}else{
System.out.print(","+node.value);
count++;
}
InOrder(node.right,count);
}
}
public void PostOrder(TreeNode node){
if(node!=null){
PostOrder(node.left);
PostOrder(node.right);
if(node==rootNode)
System.out.print(node.value);
else
System.out.print(node.value+",");
}
}
}