求助。谁帮我看看这个二叉树的主类该怎么写。琢磨了好久

Hosenschlitz 2018-11-06 11:18:28
这是课本的代码,没有给出主类,方法跟函数都有了,在网上也找了很多办法,就是不知道这个二叉树怎么实现。
还有这个getData是自动修改添加上去的,不知道删了会不会对后面的运行有影响
public T getData() {
// TODO Auto-generated method stub
return data;
}


后面是代码

二叉树链式存储的每个结点可描述为:
public class Node<T> {
public Node<T> lChild; //左孩子
private T data; //数据域
public Node<T> rChild; //右孩子

public Node(){ //构造函数,创建一个空节点
data=null;
lChild=null;
rChild=null;
}
public Node(T x){ //重载构造函数,创建一个数据值为x的节点
data=x;
lChild=null;
rChild=null;
}
public T getData() {
// TODO Auto-generated method stub
return data;
}

}


二叉树的基本操作:
public class BinaryTree<T> {
private Node<T> root;
private final int maxNodes=100;
//1、创建一个空的二叉树
public BinaryTree(){
this.root=new Node<T>(); //创建根结点,该结点的数据域为空
}

//2、生成一棵二叉树
public BinaryTree(T x){
this.root=new Node<T>(x); //创建一棵以数据元素x为根结点的二叉树
}

//3、向二叉树中插入一个左孩子结点
public boolean insertLeft(T x,Node<T> parent){
if(parent==null) return false;
Node<T> p=new Node<T>(x); //创建一个新结点
if(parent.lChild==null)
parent.lChild=p; //将新结点直接设置到父结点的左孩子结点
else{
p.lChild=parent.lChild; //先将父结点原来的左子树设置为新结点的左子树
parent.lChild=p; //再将新结点设置到父结点的左孩子结点
}
return true;
}

//4、向二叉树中插入一个右孩子结点
public boolean insertRight(T x,Node<T> parent){
if(parent==null) return false;
Node<T> p=new Node<T>(x);
if(parent.rChild==null)
parent.rChild=p; //将新结点直接设置到父结点的右孩子结点
else{
p.lChild=parent.rChild; //先将父结点原来的左子树设置为新结点的右子树
parent.rChild=p; //再将新结点设置到父结点的右孩子结点
}
return true;
}

//5、删除二叉树的左子树
public boolean deleteLeft(Node<T> parent){
if(parent==null) return false;
else{
parent.lChild=null;
return true;
}
}

//6、删除二叉树的右子树
public boolean deleteRight(Node<T> parent){
if(parent==null) return false;
else{
parent.rChild=null;
return true;
}
}

//7、先序遍历二叉树
public void preorder(Node<T> node){
if(node==null) return;
else{
System.out.println(node.getData());
preorder(node.lChild);
preorder(node.rChild);
}
}

//8、中序遍历
public void inorder(Node<T> node){
if(node==null) return;
else{
inorder(node.lChild);
System.out.println(node.getData());
inorder(node.rChild);
}
}

//9、后序遍历
public void postorder(Node<T> node){
if(node==null) return;
else{
postorder(node.lChild);
postorder(node.rChild);
System.out.println(node.getData());
}
}

//10、层次遍历
public void levelOrder(){
Node<T>[] queue=new Node[this.maxNodes]; //构造一个队列
int front,rear; //队首指针,队尾指针
if(this.root==null) return;
front=-1; //队列暂为空,队首指针不指向任何一个数组元素
rear=0; //队列暂时为空,队尾指针指向第一个数组元素
queue[rear]=this.root; //二叉树的根结点进队列
while(front!=rear){
front++;
System.out.println(queue[front].getData()); /*访问队首结点的数据域*/
//将队首结点的左孩子结点进队列
if(queue[front].lChild!=null){
rear++;
queue[rear]=queue[front].lChild;
}
//将队首结点的右孩子结点进队列
if(queue[front].rChild!=null){
rear++;
queue[rear]=queue[front].rChild;
}
}
}

//11、按指定方式遍历二叉树
//i=0表示先序遍历,=1表示中序遍历,=2表示后序遍历,=3表示层次遍历
public void traversal(int i){
switch (i) {
case 0:preorder(this.root); break;
case 1:inorder(this.root); break;
case 2:postorder(this.root);break;
default:levelOrder();break;
}
}

//12、求二叉树的高度
//使用后序遍历法计算二叉树的高度
//当parent为root时,即可计算当前二叉树的高度
public int getHeight(Node<T> parent){
int lh,rh,max;
if(parent!=null){
lh=getHeight(parent.lChild); //求左子树的高度
rh=getHeight(parent.rChild); //求右子树的高度
max=lh>rh?lh:rh;
return max+1;
}
else return 0;
}


}


主类:
public class test {

public static void main(String[] args) {
// TODO Auto-generated method stub


}

}
...全文
39 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Hosenschlitz 2018-11-12
  • 打赏
  • 举报
回复
引用 7 楼 nayi_224的回复:
[quote=引用 6 楼 qq_42252866 的回复:] [quote=引用 3 楼 nayi_224的回复:]根节点多了一层,可以把构造方法改成这样
//	//2、生成一棵二叉树
//	public BinaryTree(T x){   
//		this.root=new Node<T>(x);   //创建一棵以数据元素x为根结点的二叉树
//	}	
	
	//2、生成一棵二叉树
	public BinaryTree(Node<T> x){   
		this.root = x;   //创建一棵以数据元素x为根结点的二叉树
	}
(会不会引起其他方法bug我没看)
有空吗?帮我看看这个查找数据x怎么写[/quote] 拿中序遍历改了一下。
	public boolean search(T x){
		
		if(root==null) 
			return false;
		
		return search(root, false, x);
		
	}
	
	private boolean search(Node<T> x, boolean flag, T date){
		
		if(flag || x == null)
			return flag;
		
		flag = search(x.lChild, flag, date);
		
		if(x.getData().equals(date))
			return true;
		
		flag = search(x.rChild, flag, date);
		if(flag || x == null)
			return flag;
		
		return false;
		
	}
[/quote] 谢谢,这边基本都完成了。
nayi_224 2018-11-12
  • 打赏
  • 举报
回复
引用 6 楼 qq_42252866 的回复:
[quote=引用 3 楼 nayi_224的回复:]根节点多了一层,可以把构造方法改成这样
//	//2、生成一棵二叉树
//	public BinaryTree(T x){   
//		this.root=new Node<T>(x);   //创建一棵以数据元素x为根结点的二叉树
//	}	
	
	//2、生成一棵二叉树
	public BinaryTree(Node<T> x){   
		this.root = x;   //创建一棵以数据元素x为根结点的二叉树
	}
(会不会引起其他方法bug我没看)
有空吗?帮我看看这个查找数据x怎么写[/quote] 拿中序遍历改了一下。
	public boolean search(T x){
		
		if(root==null) 
			return false;
		
		return search(root, false, x);
		
	}
	
	private boolean search(Node<T> x, boolean flag, T date){
		
		if(flag || x == null)
			return flag;
		
		flag = search(x.lChild, flag, date);
		
		if(x.getData().equals(date))
			return true;
		
		flag = search(x.rChild, flag, date);
		if(flag || x == null)
			return flag;
		
		return false;
		
	}
Hosenschlitz 2018-11-12
  • 打赏
  • 举报
回复
emmmm…如果有点注释就好了 。不太理解这个flag
Hosenschlitz 2018-11-11
  • 打赏
  • 举报
回复
引用 3 楼 nayi_224的回复:
根节点多了一层,可以把构造方法改成这样
//	//2、生成一棵二叉树
//	public BinaryTree(T x){   
//		this.root=new Node<T>(x);   //创建一棵以数据元素x为根结点的二叉树
//	}	
	
	//2、生成一棵二叉树
	public BinaryTree(Node<T> x){   
		this.root = x;   //创建一棵以数据元素x为根结点的二叉树
	}
(会不会引起其他方法bug我没看)
有空吗?帮我看看这个查找数据x怎么写
Hosenschlitz 2018-11-10
  • 打赏
  • 举报
回复
谢谢,你给的这个构造方法可以实现这个层次遍历。还有最后一个问题,就是用
public boolean search(T x){}

来实现在当前二叉树中查找数据x。
里面的方法憋不出了。。。在Java没有深入太多
nayi_224 2018-11-08
  • 打赏
  • 举报
回复
根节点多了一层,可以把构造方法改成这样
//	//2、生成一棵二叉树
//	public BinaryTree(T x){   
//		this.root=new Node<T>(x);   //创建一棵以数据元素x为根结点的二叉树
//	}	
	
	//2、生成一棵二叉树
	public BinaryTree(Node<T> x){   
		this.root = x;   //创建一棵以数据元素x为根结点的二叉树
	}
(会不会引起其他方法bug我没看)
nayi_224 2018-11-07
  • 打赏
  • 举报
回复
@SuppressWarnings("all")
public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Node<String> node = new Node("0");
		BinaryTree<String> tree = new BinaryTree(node);
		tree.insertLeft("1", node);
		tree.insertLeft("2", node);
		tree.insertLeft("3", node);
		tree.insertLeft("4", node);
		tree.insertLeft("5", node);
		tree.insertLeft("5", node);
		tree.insertLeft("5", node);
		tree.insertLeft("5", node);
		tree.preorder(node);
	}

}
运行起来简单,关键你想要什么结果啊
Hosenschlitz 2018-11-07
  • 打赏
  • 举报
回复
那你看看我这个层次遍历哪里出问题了啊?我这运行运行不了层次遍历

50,530

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧