要求:用java编写代码,不用C++;
创建一个二叉树,结点存放的是整型数据,遵循的规则是:第一个数值作为二叉树的树根,小于父节点的值放在左子节点,大于父节点的值放在右子节点。 在创建好二叉树的基础之上,进行查询,通过输入的要查询的值,找出它双亲结点、孩子结点、兄弟结点。 输出二叉树的前序、中序、后序遍历结果。
输入格式:
输入数值为整型,多行输入。 第一行:二叉树的结点个数。 第二行:结点的值,以逗号间隔。 第三行:要查询的结点值。
输出格式:
第一行输出要查询的结点的双亲结点。 第二行输出要查询的结点的孩子结点。 第三行输出兄弟结点。 第四行为二叉树前序遍历结果。 第五行为二叉树中序遍历结果。 第六行为二叉树后序遍历结果。
输入样例:
在这里给出一组输入。例如:
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.List;
import java.util.Scanner;
public class BinaryTree {
private Node root;
/**
* 内部节点类
*/
private class Node{
private Node left;
private Node right;
private int data;
public Node(int data){
this.left = null;
this.right = null;
this.data = data;
}
}
public BinaryTree(){
root = null;
}
/**
* 递归创建二叉树
* @param node
* @param data
*/
public void buildTree(Node node,int data){
if(root == null){
root = new Node(data);
}else{
if(data < node.data){
if(node.left == null){
node.left = new Node(data);
}else{
buildTree(node.left,data);
}
}else{
if(node.right == null){
node.right = new Node(data);
}else{
buildTree(node.right,data);
}
}
}
}
/**
* 前序遍历
* @param node
*/
public void preOrder(Node node,StringBuilder sb){
if(node != null){
sb.append(node.data+",");
preOrder(node.left,sb);
preOrder(node.right,sb);
}
}
/**
* 中序遍历
* @param node
*/
public void inOrder(Node node,StringBuilder sb){
if(node != null){
inOrder(node.left,sb);
sb.append(node.data+",");
inOrder(node.right,sb);
}
}
/**
* 后序遍历
* @param node
*/
public void postOrder(Node node,StringBuilder sb){
if(node != null){
postOrder(node.left,sb);
postOrder(node.right,sb);
sb.append(node.data+",");
}
}
//查询双亲
public Node parent(int target){
Node temp=parent(root, target);
return temp;
}
public Node parent(Node node,int target){
if(node==null){
return null;
}
if((node.left!=null&&node.left.data==target)||(node.right!=null&&node.right.data==target)){
return node;
}
//在左子树中查找 , 如果左子树中没有去右子树中查找
Node N;
if((N=parent(node.left,target))!=null){
return N;
}else{
return parent(node.right,target);
}
}
//查询目标当前节点
public Node findNode(int target){
Node node = new Node(target);
if(root==null){
return null;
}else{
Node temp=findNode(root,target);
return temp;
}
}
public Node findNode(Node root,int target){
if(root==null){
return null;
}
if(root.data==target){
return root;
}
Node N;
Node P;
if((N=findNode(root.left,target))!=null){
return N;
}else{
root=root.right;
if((P=findNode(root,target))==null){
return null;
}else{
return P;
}
}
}
public static void main(String[] args) {
StringBuilder sb=new StringBuilder();
Scanner scanner=new Scanner(System.in);
System.out.println("输入:");
int count=scanner.nextInt();
String[] a = scanner.next().split(",");
int target=scanner.nextInt();
BinaryTree bTree = new BinaryTree();
for (int i = 0; i < a.length; i++) {
bTree.buildTree(bTree.root, Integer.valueOf(a[i]));
}
System.out.println("输出:");
Node parent = bTree.parent(target);
if (parent==null){
System.out.println(target+"无双亲");
}else{
System.out.println(target+"的双亲是"+parent.data);
}
Node currNode = bTree.findNode(target);
if (currNode==null){
System.out.println("不存在当前节点");
}else{
if(currNode.left==null&&currNode.right==null){
System.out.println(target+"无孩子");
}else{
System.out.print(target+(currNode.left==null?"无左孩子":"左孩子是"+currNode.left.data));
System.out.println(currNode.right==null?"无右孩子":"右孩子是"+currNode.right.data);
}
}
if(parent==null){
System.out.println(target+"无兄弟");
}else {
if (parent.right == null || parent.left == null) {
System.out.println(target + "无兄弟");
} else {
System.out.println(target + "的兄弟是" + (parent.right.data == currNode.data ? parent.left.data : parent.right.data));
}
}
bTree.preOrder(bTree.root,sb);
System.out.println("前序结果"+sb.toString().substring(0,sb.length()-1));
sb.setLength(0);
bTree.inOrder(bTree.root,sb);
System.out.println("中序结果"+sb.toString().substring(0,sb.length()-1));
sb.setLength(0);
bTree.postOrder(bTree.root,sb);
System.out.println("后序结果"+sb.toString().substring(0,sb.length()-1));
}
}
import java.util.List;
import java.util.Scanner;
public class BinaryTree {
private Node root;
/**
* 内部节点类
*/
private class Node{
private Node left;
private Node right;
private int data;
public Node(int data){
this.left = null;
this.right = null;
this.data = data;
}
}
public BinaryTree(){
root = null;
}
/**
* 递归创建二叉树
* @param node
* @param data
*/
public void buildTree(Node node,int data){
if(root == null){
root = new Node(data);
}else{
if(data < node.data){
if(node.left == null){
node.left = new Node(data);
}else{
buildTree(node.left,data);
}
}else{
if(node.right == null){
node.right = new Node(data);
}else{
buildTree(node.right,data);
}
}
}
}
/**
* 前序遍历
* @param node
*/
public void preOrder(Node node,StringBuilder sb){
if(node != null){
sb.append(node.data+",");
preOrder(node.left,sb);
preOrder(node.right,sb);
}
}
/**
* 中序遍历
* @param node
*/
public void inOrder(Node node,StringBuilder sb){
if(node != null){
inOrder(node.left,sb);
sb.append(node.data+",");
inOrder(node.right,sb);
}
}
/**
* 后序遍历
* @param node
*/
public void postOrder(Node node,StringBuilder sb){
if(node != null){
postOrder(node.left,sb);
postOrder(node.right,sb);
sb.append(node.data+",");
}
}
//查询双亲
public Node parent(int target){
Node temp=parent(root, target);
return temp;
}
public Node parent(Node node,int target){
if(node==null){
return null;
}
if((node.left!=null&&node.left.data==target)||(node.right!=null&&node.right.data==target)){
return node;
}
//在左子树中查找 , 如果左子树中没有去右子树中查找
Node N;
if((N=parent(node.left,target))!=null){
return N;
}else{
return parent(node.right,target);
}
}
//查询目标当前节点
public Node findNode(int target){
Node node = new Node(target);
if(root==null){
return null;
}else{
Node temp=findNode(root,target);
return temp;
}
}
public Node findNode(Node root,int target){
if(root==null){
return null;
}
if(root.data==target){
return root;
}
Node N;
Node P;
if((N=findNode(root.left,target))!=null){
return N;
}else{
root=root.right;
if((P=findNode(root,target))==null){
return null;
}else{
return P;
}
}
}
public static void main(String[] args) {
StringBuilder sb=new StringBuilder();
Scanner scanner=new Scanner(System.in);
System.out.println("输入:");
int count=scanner.nextInt();
String[] a = scanner.next().split(",");
int target=scanner.nextInt();
BinaryTree bTree = new BinaryTree();
for (int i = 0; i < a.length; i++) {
bTree.buildTree(bTree.root, Integer.valueOf(a[i]));
}
System.out.println("输出:");
Node parent = bTree.parent(target);
if (parent==null){
System.out.println(target+"无双亲");
}else{
System.out.println(target+"的双亲是"+parent.data);
}
Node currNode = bTree.findNode(target);
if (currNode==null){
System.out.println("不存在当前节点");
}else{
if(currNode.left==null&&currNode.right==null){
System.out.println(target+"无孩子");
}else{
System.out.print(target+(currNode.left==null?"无左孩子":"左孩子是"+currNode.left.data));
System.out.println(currNode.right==null?"无右孩子":"右孩子是"+currNode.right.data);
}
}
if(parent==null){
System.out.println(target+"无兄弟");
}else {
if (parent.right == null || parent.left == null) {
System.out.println(target + "无兄弟");
} else {
System.out.println(target + "的兄弟是" + (parent.right.data == currNode.data ? parent.left.data : parent.right.data));
}
}
bTree.preOrder(bTree.root,sb);
System.out.println("前序结果"+sb.toString().substring(0,sb.length()-1));
sb.setLength(0);
bTree.inOrder(bTree.root,sb);
System.out.println("中序结果"+sb.toString().substring(0,sb.length()-1));
sb.setLength(0);
bTree.postOrder(bTree.root,sb);
System.out.println("后序结果"+sb.toString().substring(0,sb.length()-1));
}
}
稍等一下,我来帮你写,待会发你。
package T4;
public class Node {
//数据域
int data;
//左孩子
Node leftChild;
//右孩子
Node rightChild;
public Node(int data) {
this.data = data;
leftChild = null;
rightChild = null;
}
}
package T4;
public class BTree {
//根节点
Node root;
public BTree(int data) {
root = new Node(data);
}
//新增节点
//10,8,7,20,90,100,3,6,1,-10
public void addNode(int data){
//获取根节点
Node p=root;
//生成新增节点
Node t = new Node(data);
while(true){
//放到根节点的左边
if(p.data>data){
if(p.leftChild !=null){
//继续往下找
p = p.leftChild;
}else{
p.leftChild = t;
break;
}
}else{//放到根节点的右边
if(p.rightChild!=null){
p=p.rightChild;
}else{
p.rightChild = t;
break;
}
}
}
}
public void display(Node root){
//先根遍历10,8,7,3,1,-10,6,20,90,100
System.out.println(root.data);
if(root.leftChild!=null){ //往左走
System.out.println("往左走");
display(root.leftChild);
}
//中根遍历:-10,1,3,6,7,8,10,20,90,100
// System.out.println(root.data);
if(root.rightChild!=null){//往右走
System.out.println("往右走");
display(root.rightChild);
}
//后根遍历:-10,1,6,3,7,8,100,90,20,10
// System.out.println(root.data);
}
public static void main(String[] args) {
//10,8,7,20,90,100,3,6,1,-10
BTree tree = new BTree(10);
tree.addNode(8);
tree.addNode(7);
tree.addNode(20);
tree.addNode(90);
tree.addNode(100);
tree.addNode(3);
tree.addNode(6);
tree.addNode(1);
tree.addNode(-10);
tree.display(tree.root);
}
}
您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~
如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~
ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632
你好,我正在做这道题,但是第二个测试点一直显示答案错误,N极大或者极小的测试点都是对的,想问问这是为啥呢