你的说法是有问题的。
通常说,通过指针作为函数的参数,可以再被调函数中,修改实际参数所指向的变量的值,也就是把改变传递给主调函数。
但是,请看清楚上面的说法,“通过指针作为函数的参数,可以再被调函数中,修改实际参数所指向的变量的值”。是修改实际参数所指向的变量的值,而不是修改实际参数本身。
你的代码里面是要修改实际参数本身,而不是修改实际参数所指向变量。
要完成这个功能,你就需要指向指针的指针了
给个思路:
找最大值的关键是树的遍历,而递归的遍历方式,就是利用函数调用,参数的入栈出栈,来达到回溯的目的,同理,不用递归调用,我们也可以采用这个思想
创建一个栈式的数据结构
将根节点指针压入栈中,访问其值,假如我们采用广度优先的遍历方式,就遍历其子节点
在访问子节点的同时,依次将访问过的节点指针压入栈中,而最上面的节点就是最后访问的节点
如最上面的节点是叶子节点,则d栈,否则继续遍历其子节点,并如3步所说,依访问顺序压栈
对于所有子节点都已遍历(压栈)的父节点,做标记,则当d栈后,栈的最上面是一个带有标记的非叶子节点,亦将其d出栈
循环3-5步,直到栈空为止
深度优先搜索,也可以用类似的方式实现
Found out how to inspect the trees, by running the view() command Eg for inspecting the first tree of the example:
view(BTrees{1})
每调用一次scanf输入终止就要一次回车,假设你的树有7个节点,以每一个回车结束,需输入字符,回车,字符,回车共七次,然后最后输入'空格'共7+7=14个,才会退出! 考虑是否可以采用一次输入的形式,如输入字符串?scanf("%s",%str); 将输入放在起始创建根节点时,将字符串指针递归的传递。
// 生成树结构
function tree(list) {
const result = [];
for (let value of list) {
// 排除空字符串的情况
if (!value) {
continue;
}
const values = valuesplit('/');
// 查找树结构的当前级别是否已经存在,不存在则创建对象,并添加入列表。
let current = resultfind(item => itemname === values[0]);
if (current === void 0) {
current = {};
resultpush(current);
}
for (let i = 0, length = valueslength; i < length; i++) {
currentname = values[i];
if (i < length - 1) {
// 如果还有下一级内容,判断当前是否有 children,没有则构建
if (currentchildren === void 0) {
currentchildren = [];
}
// 查找下一级对象,为下一遍遍历构建对象
let nextCurrent = currentchildrenfind(item => itemname === values[i + 1]);
if (nextCurrent === void 0) {
nextCurrent = {};
currentchildrenpush(nextCurrent);
}
current = nextCurrent;
}
}
}
return result;
}
============ 假装分割线 ===========
以上代码是生成树的函数,调用 tree 函数并传入你的 input 数据,返回值就是生成的树。百科没找到传代码的地方了。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)