移植openwrt到beaglebone black遇到的问题

本来以为不难,结果还是跟以往一样,有点麻烦。

记录遇到的问题,现在我尝试的是将bbb从TF卡启动,是成功的。参考:

http://www.eeboard.com/evaluation/%E4%B8%AD%E5%9B%BD%E6%9D%BFbeaglebone-black%E4%B9%8Bmicrosd%E5%8D%A1%E5%90%AF%E5%8A%A8%E7%B3%BB%E7%BB%9F/

这之后,TF卡会有两个分区,一个是FAT16的引导分区,存放MLO文件,uboot等。另一个是EXT4,存放根文件系统。

这一步比较简单,之后是希望把openwrt放到TF卡上,然后让bbb从板子上启动。

记录一下官方更新的镜像路径:

http://downloads.angstrom-distribution.org/demo/beaglebone/testing/


第一次尝试:

这次的做法是失败的,我没有重新分区,直接从openwrt的snapshots中下载已经编好的给bbb用的所有镜像文件和根文件系统,替换掉TF卡中原来的。参考的是:http://wiki.openwrt.org/toh/beaglebone/black#installation

暂时也不清楚openwrt提供的MLO和uboot和出厂提供的版本有什么区别,基本我想也是失败的,但是没想到失败到连一点log都没打印出来,估计是uboot都没有跑起来吧。

package BinaryTree; public class RedBlackTree<Key extends Comparable<Key>, Value> { public Node root; private int N; private static boolean RED = true; private static boolean BLACK = false; private class Node<Key,Value> { public Key key; private Value value; public Node left; public Node right; public boolean color; public Node(Key key, Value value,Node left,Node right,boolean color){ this.key = key; this.value = value; this.left = left; this.right = right; this.color = color; } } public RedBlackTree() { this.root = null; this.N = 0; } private boolean isRed(Node h){ if(h==null) return false; return h.color; } private Node rotateLeft(Node h){ Node x = h.right; h.right = x.left; x.left = h; x.color=h.color; h.color=RED; return x; } private Node rotateRight(Node h){ Node x = h.left; h.left = x.right; x.right = h; x.color=h.color; h.color=RED; return x; } private void flipColors(Node h){ h.color=RED; h.left.color=BLACK; h.right.color=BLACK; } public void put(Key key, Value value){ root = put(root, key, value); root.color=BLACK; } public Node put(Node h,Key key,Value value){ if(h==null){ N++; return new Node(key,value,null,null,RED); } int cmp=key.compareTo((Key) h.key); if(cmp>0){ put(h.right,key,value); } else if(cmp<0){ put(h.left,key,value); }else{ h.key=key; h.value=value; } if(isRed(h.right)&&!isRed(h.left)){ h=rotateLeft(h); } if(isRed(h.left)&&isRed(h.left.left)){ h=rotateRight(h); } if(isRed(h.right)&&isRed(h.left)){ flipColors(h); } return h; } public Value get(Key key){ return get(root,key); } private Value get(Node x,Key key){ if(x==null){ return null; } int cmp=key.compareTo((Key) x.key); if(cmp>0){ return (Value) get(x.right,key); } else if(cmp<0){ return (Value) get(x.left,key); } else{ return (Value) x.value; } } public int size(){ return N; } } package BinaryTree; public class RedBlackTreeTest { public static void main(String[] args) { RedBlackTree<Integer,String> rb=new RedBlackTree<Integer, String>(); rb.put(1,"yang"); rb.put(2,"de"); rb.put(3,"bin"); String s1=rb.get(1); System.out.println(s1); String s2=rb.get(2); System.out.println(s2); String s3=rb.get(3); System.out.println(s3); } } 运行出来只有s1可以输出为什么
最新发布
11-13
你的红黑树代码在运行时**只有 `s1` 能输出,而 `s2` 和 `s3` 输出为 `null`**,这是一个典型的 **插入操作未正确更新子树引用** 导致的问题。 --- ### ❌ 问题原因:`put(Node h, ...)` 方法中递归调用没有将返回值赋给左右子节点! 这是最核心的错误。 你写了: ```java if (cmp > 0) { put(h.right, key, value); // ❌ 错误!没有把返回值赋给 h.right } else if (cmp < 0) { put(h.left, key, value); // ❌ 同样错误! } else { h.key = key; h.value = value; } ``` 👉 这里只是“调用了”递归方法,但**没有接收返回的新子树根节点**,也没有更新 `h.left` 或 `h.right` 的引用! 这导致: - 新节点虽然被创建了,但**没有链接到父节点上**; - 树结构没有真正改变; - 插入失败或丢失节点; - 最终查找时找不到对应键,返回 `null`。 --- ### ✅ 正确做法:必须将递归 `put` 的返回值赋给 `h.left` 或 `h.right` 修改如下: ```java if (cmp > 0) { h.right = put(h.right, key, value); // ✅ 正确:更新右子树 } else if (cmp < 0) { h.left = put(h.left, key, value); // ✅ 正确:更新左子树 } else { h.value = value; // 更新值即可(key已存在) } ``` 否则即使你在最后写了 `return h;`,前面的更改也不会生效。 --- ### 其他潜在问题说明 #### 1. `N++` 只在插入新节点时加一次是正确的 ✅ 你只在 `h == null` 时 `N++`,没问题。 #### 2. 颜色翻转和旋转逻辑基本正确(假设是左倾红黑树) ⚠️ 但是由于插入没链接上去,这些平衡操作也无从谈起。 #### 3. `root.color = BLACK;` 在 `put` 外部设置是对的 ✅ 每次插入完成后确保根为黑色。 #### 4. 类型警告与强制转换 你用了泛型但很多地方有 `(Key)` 强制转换,是因为内部类也定义了 `<Key, Value>`,造成遮蔽。建议修改内部类声明。 --- ### ✅ 修改后的 `put(Node, Key, Value)` 方法(修复版) ```java private Node put(Node h, Key key, Value value) { if (h == null) { N++; return new Node(key, value, null, null, RED); } int cmp = key.compareTo((Key) h.key); if (cmp > 0) { h.right = put(h.right, key, value); // ✅ 关键修复 } else if (cmp < 0) { h.left = put(h.left, key, value); // ✅ 关键修复 } else { h.value = value; // 更新已有键的值 } // 平衡操作(左旋、右旋、颜色翻转) if (isRed(h.right) && !isRed(h.left)) { h = rotateLeft(h); } if (isRed(h.left) && isRed(h.left.left)) { h = rotateRight(h); } if (isRed(h.left) && isRed(h.right)) { flipColors(h); } return h; } ``` --- ### 🔍 为什么 `s1` 可以输出? 因为你是按顺序插入 `1 -> "yang"`, `2 -> "de"`, `3 -> "bin"`。 - 插入 `1` 时,`root == null`,成功创建并返回,`root = 新节点`,所以有效。 - 查找 `1` 成功 → 输出 `"yang"` 但插入 `2` 时: - 比较 `2 > 1`,进入 `put(h.right, ...)`; - 但由于 **没有写成 `h.right = put(...)`**,这个新节点根本没接到 `1` 的右边; - 所以 `1` 的 `right` 仍然是 `null`; - 同理,`3` 也无法接入; 因此后续查找 `2` 和 `3` 都会走到空节点 → 返回 `null`。 --- ### ✅ 完整修复建议总结 | 问题 | 修复方式 | |------|----------| | 未更新子树引用 | 改成 `h.left = put(...)` 和 `h.right = put(...)` | | 内部类泛型遮蔽 | 建议删除内部类上的 `<Key,Value>`,使用外层类型 | | 类型强转过多 | 使用一致泛型可避免 `(Key)` 强制转换 | --- ### ✅ 推荐修正内部类声明(去泛型) ```java private class Node { public Key key; private Value value; public Node left; public Node right; public boolean color; public Node(Key key, Value value, Node left, Node right, boolean color) { this.key = key; this.value = value; this.left = left; this.right = right; this.color = color; } } ``` 这样就不会和外部泛型冲突,也无需频繁强转。 --- ### 最终效果(修复后) ```java rb.put(1, "yang"); rb.put(2, "de"); rb.put(3, "bin"); System.out.println(rb.get(1)); // yang System.out.println(rb.get(2)); // de System.out.println(rb.get(3)); // bin ``` 全部正常输出 ✅ ---
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值