JAVA中递归传递引用的问题

顽皮猫喵 2017-09-04 04:39:38
我的main函数是这样的:
 public static void main(String[] args) {
Search_BTree tree2=null,pre=new Search_BTree();
tree2 = Search_BTree.autoCreate(3);
tree2.createSearchBTreeEn(tree2,pre);
}



Search_BTree类是这样的:
public class Search_BTree {
public Search_BTree Left;
public Search_BTree Right;
public String str;
public int ltag;//1表示指向前驱或后继 0 表示指向孩子
public int rtag;

//变为线索二叉
public void createSearchBTreeEn(Search_BTree tree,Search_BTree pre){
if(null == tree)
return ;
createSearchBTreeEn(tree.Left,pre);
if(null == tree.Left){
tree.ltag=1;
tree.Left=pre;
}
if(null == pre.Right){
pre.rtag=1;
pre.Right=tree;
}
pre = tree;

createSearchBTreeEn(tree.Right,pre);
}

//前序遍历创建二叉树
public static Search_BTree createSearchBTree(Search_BTree tree){
String str = new Scanner(System.in).next();
if(!str.equals("#")){
tree=new Search_BTree(str);
tree.Left=createSearchBTree(tree.Left);
tree.Right=createSearchBTree(tree.Right);
return tree;
}
return null;
}

//自动创建满二叉树
public static Search_BTree autoCreate(int k){
int sum = (int)Math.pow(2,k)-1;
int hasChildren = (int)Math.pow(2,k-1)-1;
Search_BTree list[] = new Search_BTree[sum+1];
for(int i=1;i<=sum;i++){
list[i]=new Search_BTree(String.valueOf(i));//全部赋值1,2,3,4.....
}
for(int i=1;i<=hasChildren;i++){
list[i].Left=list[2*i];
list[i].Right=list[2*i+1];
}
return list[1];
}

//层次遍历
public void Hierarchy(Search_BTree tree){
int current=-1,position=0;
List<Search_BTree> list = new ArrayList();
if(tree!=null){
list.add(tree);
while(current!=position){
current++;
if(list.get(current).Left!=null){
list.add(list.get(current).Left);
position++;
}
if(list.get(current).Right!=null){
list.add(list.get(current).Right);
position++;
}
}
for (Search_BTree node : list){
System.out.println(node.str);
}
}
}

//层次遍历递归
public void HierarchyDG(Search_BTree tree,int k,List list){
if(tree!=null){
if(k==1){
list.add(tree);
}
if(tree.Left!=null){
list.add(tree.Left);
}
if(tree.Right!=null){
list.add(tree.Right);
}
if(tree.Left!=null){
HierarchyDG(tree.Left,k+1,list);
}
if(tree.Right!=null){
HierarchyDG(tree.Right,k+1,list);
}
}
}


public Search_BTree() {
}

public Search_BTree(String str) {
this.str = str;
}
}



问题在于Search_BTree里面, createSearchBTreeEn方法里面有一句 pre = tree; 可以 我在自动创建的满二叉树里面,单步调试后,发现这句话并没有传递引用啊,跳出来后,pre又变回原来的值了,之前pre = tree这里改变了指针的指向没用了。!!?这是为啥,求大神帮忙啊!!
...全文
5541 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复

这是我上次项目里面用到的两层菜单不知道能不能帮助你
  • 打赏
  • 举报
回复
如果只有两层递归用lambda会比较简单简洁
KeepSayingNo 2020-08-19
  • 打赏
  • 举报
回复
可以在main方法里面定义一个变量,然后将这个变量传到递归方法中,递归方法重复用这个变量
llihua 2020-08-19
  • 打赏
  • 举报
回复
算法有点意思啊,代码问题不大。createSearchBTreeEn()的参数pre,传的是对象引用变量啊,退出方法后,pre就变回调用之前的变量值,引用之前的对象了。Java就是这样,不像C/C++,可以传指针,然后把更新返回到外层。 如果要返回更新的pre,确实没有特别好的办法,要么把pre做成static或全局变量,要么通过方法的返回值返回,要么封装一个类作参数,然后通过类中的成员来返回多个值。 另外,那个层次遍历递归HierarchyDG()方法也有点怪,实际遍历的顺序既不是前序后序或中序,也不是深度优先或广度优先遍历。Hierarchy()方法倒是广度优先遍历的。
  • 打赏
  • 举报
回复

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Search_BTree {
    public Search_BTree Left;
    public Search_BTree Right;
    public String str;
    public int ltag;//1表示指向前驱或后继 0 表示指向孩子
    public int rtag;

    //变为线索二叉
    public void createSearchBTreeEn(Search_BTree tree,Search_BTree pre){
        if(null == tree)
            return ;
        createSearchBTreeEn(tree.Left,pre);
        if(null == tree.Left){
            tree.ltag=1;
            tree.Left=pre;
        }
        if(null == pre.Right){
            pre.rtag=1;
            pre.Right=tree;
        }
        pre = tree;

        createSearchBTreeEn(tree.Right,pre);
    }

    //前序遍历创建二叉树
    public static Search_BTree createSearchBTree(Search_BTree tree){
        String str = new Scanner(System.in).next();
        if(!str.equals("#")){
            tree=new Search_BTree(str);
            tree.Left=createSearchBTree(tree.Left);
            tree.Right=createSearchBTree(tree.Right);
            return tree;
        }
        return null;
    }

    //自动创建满二叉树
    public static Search_BTree autoCreate(int k){
        int sum = (int)Math.pow(2,k)-1;
        int hasChildren = (int)Math.pow(2,k-1)-1;
        Search_BTree list[] = new Search_BTree[sum+1];
        for(int i=1;i<=sum;i++){
            list[i]=new Search_BTree(String.valueOf(i));//全部赋值1,2,3,4.....
        }
        for(int i=1;i<=hasChildren;i++){
            list[i].Left=list[2*i];
            list[i].Right=list[2*i+1];
        }
        return list[1];
    }

    //层次遍历
    public void Hierarchy(Search_BTree tree){
        int current=-1,position=0;
        List<Search_BTree> list = new ArrayList();
        if(tree!=null){
            list.add(tree);
            while(current!=position){
                current++;
                if(list.get(current).Left!=null){
                    list.add(list.get(current).Left);
                    position++;
                }
                if(list.get(current).Right!=null){
                    list.add(list.get(current).Right);
                    position++;
                }
            }
            for (Search_BTree node : list){
                System.out.println(node.str);
            }
        }
    }

    //层次遍历递归
    public void HierarchyDG(int k,List list,List<Search_BTree> children){
    	if(children.size() == 0)
    		return;
    	if(k==1){
    		for (Search_BTree search_BTree : children) {
    			list.add(search_BTree);
    		}
		}
    	List<Search_BTree> newChildren = new ArrayList<Search_BTree>();
    	for (int j = 0; j < children.size(); j++) {
    		Search_BTree tree = children.get(j);
    		if(tree!=null){
    			
    			if(tree.Left!=null){
    				list.add(tree.Left);
    				newChildren.add(tree.Left);
    			}
    			if(tree.Right!=null){
    				list.add(tree.Right);
    				newChildren.add(tree.Right);
    			}
    			
//            if(tree.Left!=null){
//                HierarchyDG(tree.Left,k+1,list);
//            }
//            if(tree.Right!=null){
//                HierarchyDG(tree.Right,k+1,list);
//            }
    		}
		}
    	HierarchyDG(k+1, list, newChildren);
    }


    public Search_BTree() {
    }

    public Search_BTree(String str) {
        this.str = str;
    }
    
    public static void main(String[] args) {
        Search_BTree tree2=null;
        tree2 = Search_BTree.autoCreate(3);
        Search_BTree search_BTree = new Search_BTree();
        List<Search_BTree> list = new ArrayList<Search_BTree>();
        List<Search_BTree> children = new ArrayList<Search_BTree>();
        children.add(tree2);
        search_BTree.HierarchyDG(1, list, children);
        for (Search_BTree item : list) {
			System.out.println(item.str);
		}
    }
}
就改了递归的地方,你试试
顽皮猫喵 2017-09-04
  • 打赏
  • 举报
回复
上面的问题我用static变量已经解决了,把pre设成一个全局的static静态变量。 换个问题,我下面两个层次遍历的,非递归的方法是对的,可以递归的层次遍历有问题,我也知道也有问题,可是我想不出来如何递归写出层次遍历了。
随着元宇宙概念兴起与虚拟数字人技术快速发展,虚拟主播、在线教育虚拟助教、元宇宙社交等应用场景对实时动作表情驱动系统提出更高需求。当前主流动作捕捉方案多依赖专业光学动捕设备或深度相机,设备成本高昂、部署复杂,难以在普通用户场景普及。本研究设计并实现一套基于普通单目摄像头的虚拟数字人实时动作表情驱动系统,旨在降低数字人内容生产门槛。系统采用Unity作为主开发引擎,结合Blender进行数字人模型构建与BlendShape表情系统制作,使用MediaPipe框架实现人脸关键点检测与人体姿态估计,通过C#脚本完成实时数据处理与渲染控制。系统包含五个关键模块:人脸关键点检测(MediaPipe Face Mesh提取468个关键点)、人体姿态估计(MediaPipe Pose识别33个骨骼关键点)、表情迁移映射、动作平滑优化(卡尔曼滤波与贝塞尔曲线插值消除抖动)、实时渲染(60fps流畅渲染,支持直播推流与视频录制)。实验结果表明,系统在普通笔记本上可实现60fps实时驱动,人脸关键点检测准确率达98.7%,人体姿态估计平均误差小于5像素,表情迁移相似度达92.3%。 【课程报告内容】 摘要 第1章 绪论 第2章 相关技术与理论基础 第3章 系统架构设计 第4章 关键模块设计与实现 第5章 实验与结果分析 第6章 总结与展望 参考文献
内容概要:本文提出了一种基于蒙特卡洛模拟与拉格朗日松弛法的分散式优化策略,用于解决电动汽车充电站在分时电价机制下的有序充电调度问题。通过蒙特卡洛方法模拟电动汽车充电行为的随机性,生成多样化负荷场景,构建以降低电网负荷波动和用户充电成本为目标的优化模型;采用拉格朗日松弛法对耦合约束进行解耦,实现分布式求解,在保障用户隐私的同时提升计算效率。文设计了详细的仿真场景,系统分析了该调度策略对电网负荷特性和用户经济性的影响,验证了所提方法在实际应用的有效性与可行性。; 适合人群:具备电力系统运行、优化算法理论及Matlab编程能力的研究生、科研人员以及从事智能电网与电动汽车相关领域的工程技术人员。; 使用场景及目标:①应用于城市规模化充电站集群的有序充电管理,实现电网“削峰填谷”;②为电力公司制定科学合理的分时电价政策提供量化分析工具;③支撑智能电网需求侧资源的分布式协同优化调度研究与系统设计。; 阅读建议:建议结合提供的Matlab代码深入理解算法实现流程,重点掌握蒙特卡洛场景生成机制与拉格朗日松弛迭代求解过程,可通过调整参数设置复现不同工况下的仿真结果,以深化对分散式优化机制与调度效果之间关系的理解。
内容概要:本文研究了基于阶跃响应的V-Tiger自动增益调整PID控制器优化方法,并提供了完整的Matlab代码实现。通过深入分析PID控制的核心性能指标与V-Tiger控制器的动态特性,提出了一种融合阶跃响应特征提取与多目标协同优化的自动整定方案,设计了具备自适应迭代校正能力的优化机制,有效提升了控制系统的响应速度、稳定性和抗干扰能力。文系统阐述了整定原理、算法架构设计及性能验证流程,通过仿真实验充分验证了该方法在复杂工业控制场景下实现高精度参数自整定的可行性与优越性,为智能PID控制提供了可复现、可拓展的技术路径。; 适合人群:具备自动控制理论基础和Matlab编程能力,从事控制工程、自动化、电气工程等领域研究的研发人员及高校研究生。; 使用场景及目标:①应用于需要高精度PID参数整定的工业控制系统,如电机驱动、温度控制、电力电子变换器等;②为科研人员提供一种可复现、可扩展的智能PID整定方法,用于提升系统动态性能与鲁棒性;③作为教学案例帮助学生理解PID整定原理与现代优化算法的融合应用。; 阅读建议:建议读者结合文的Matlab代码逐模块运行与调试,重点关注阶跃响应特征提取与增益优化策略的实现逻辑,同时可尝试将其应用于实际控制系统进行对比验证,以深化对自动整定机制的理解。

62,622

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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