diff --git a/problems/前序/ACM模式如何构建二叉树.md b/problems/前序/ACM模式如何构建二叉树.md index f2aafed6..01d5b255 100644 --- a/problems/前序/ACM模式如何构建二叉树.md +++ b/problems/前序/ACM模式如何构建二叉树.md @@ -57,11 +57,18 @@ TreeNode* construct_binary_tree(const vector& vec) { if (i == 0) root = node; } // 遍历一遍,根据规则左右孩子赋值就可以了 - // 注意这里 结束规则是 i * 2 + 2 < vec.size(),避免空指针 - for (int i = 0; i * 2 + 2 < vec.size(); i++) { + // 注意这里 结束规则是 i * 2 + 1 < vec.size(),避免空指针 + // 为什么结束规则不能是i * 2 + 2 < arr.length呢? + // 如果i * 2 + 2 < arr.length 是结束条件 + // 那么i * 2 + 1这个符合条件的节点就被忽略掉了 + // 例如[2,7,9,-1,1,9,6,-1,-1,10] 这样的一个二叉树,最后的10就会被忽略掉 + // 遍历一遍,根据规则左右孩子赋值就可以了 + + for (int i = 0; i * 2 + 1 < vec.size(); i++) { if (vecTree[i] != NULL) { // 线性存储转连式存储关键逻辑 vecTree[i]->left = vecTree[i * 2 + 1]; + if(i * 2 + 2 < vec.size()) vecTree[i]->right = vecTree[i * 2 + 2]; } } @@ -114,9 +121,10 @@ TreeNode* construct_binary_tree(const vector& vec) { vecTree[i] = node; if (i == 0) root = node; } - for (int i = 0; i * 2 + 2 < vec.size(); i++) { + for (int i = 0; i * 2 + 1 < vec.size(); i++) { if (vecTree[i] != NULL) { vecTree[i]->left = vecTree[i * 2 + 1]; + if(i * 2 + 2 < vec.size()) vecTree[i]->right = vecTree[i * 2 + 2]; } } @@ -213,7 +221,7 @@ public class Solution { static class TreeNode { // 节点值 int val; - + // 左节点 TreeNode left; @@ -249,12 +257,18 @@ public class Solution { } } // 遍历一遍,根据规则左右孩子赋值就可以了 - // 注意这里 结束规则是 i * 2 + 2 < arr.length,避免空指针 - for (int i = 0; i * 2 + 2 < arr.length; i++) { + // 注意这里 结束规则是 i * 2 + 1 < arr.length,避免空指针 + // 为什么结束规则不能是i * 2 + 2 < arr.length呢? + // 如果i * 2 + 2 < arr.length 是结束条件 + // 那么i * 2 + 1这个符合条件的节点就被忽略掉了 + // 例如[2,7,9,-1,1,9,6,-1,-1,10] 这样的一个二叉树,最后的10就会被忽略掉 + for (int i = 0; i * 2 + 1 < arr.length; i++) { TreeNode node = treeNodeList.get(i); if (node != null) { // 线性存储转连式存储关键逻辑 node.left = treeNodeList.get(2 * i + 1); + // 再次判断下 不忽略任何一个节点 + if(i * 2 + 2 < arr.length) node.right = treeNodeList.get(2 * i + 2); } }