关于二叉树的体会与理解
1.二叉树的拷贝构造方法
我一开始将二叉树的拷贝构造方法的主体写在了BinaryTree中,但是具体的实现还是调用了树节点类中的方法
感觉不是特别好,但是没想怎么在类内实现
//BinaryTree
public BinaryTree(BinaryTree<T> p) {
this.root=new BinaryNode<T>(p.root.data);//拷贝根节点数据
this.root.BinaryTreecopy(p.root);//传入节点
}
//BinaryNode
void BinaryTreecopy(BinaryNode<T> p) {
if(p!=null) {
if(p.left!=null) { //建立左孩子
BinaryNode<T> q=new BinaryNode<T>(p.left.data);
this.left=q;
q.BinaryTreecopy(p.left); //递归调用
}
else this.left=null; //否则给空
if(p.right!=null) { //右孩子
BinaryNode<T> q=new BinaryNode<T>(p.right.data);
this.right=q;
q.BinaryTreecopy(p.right); //递归调用
}
else this.right=null;
}
}
二叉树的先序中序构造二叉树
既然有两种序列,那么一定要有先根序列的子树的起点和终点,同理中根序列也要有两个参数来表明,那么在进行构造的时候就一定要有先序数组,先序的起点终点,中序数组,中序的起点终点,六个参数。少一个都不能唯一确定一棵二叉树。先序中序构造二叉树的详细流程
下面是实现的代码
public BinaryTree(T prelist[], T inlist[]) {
int start=0,end=prelist.length-1;
this.root=create(prelist,inlist,start,end,start,end);
}
public BinaryNode<T>create(T[] prelist,T[]inlist,int prestart,int preend,int instart, int inend){
if(prestart>preend||instart>inend)
return null;
BinaryNode<T>p=new BinaryNode<T>(prelist[prestart]);
for(int n=instart;n<=inend;n++)
if(prelist[prestart].equals(inlist[n])){
p.left=create(prelist,inlist,prestart+1,prestart+n,instart,n-1);
p.right=create(prelist,inlist,n+prestart+1-instart,preend,n+1,inend);
}
return p;
}
构造方法的重点是四个位置的确定。
想得到不一定写的出,写的出不一定跑得起来,跑得起来不一定有正确结果。。
多单步调试吧,多用笔,画草图,总比死定屏幕好(手动滑稽)
双笙的歌一直炒鸡好听https://music.163.com/song?id=534540498&userid=431967872
摸鱼
写个小游戏,就是一直bug。。。没调。。。界面也很丑,好的,下期再见