为什么跳出函数后节点值变了?
Why the node value changed when get out of the function?
我正在尝试用 C++ 中的预序和忽略序列构建一个二叉树(无重复)。
编码如下:
#include <iostream>
#include <string>
#include <vector>
#include <cmath>
using namespace std;
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x): val(x),left(NULL),right(NULL) {}
};
int idx = 0; //idx in preorder
void helper(TreeNode* node,int start,int end, vector<int>& preorder, vector<int>& inorder) {
if (start == end) return;
int dummy;
for (dummy = 0; dummy<inorder.size(); dummy++) {
if (inorder[dummy] == node->val) {
break;
}
}
idx ++;
TreeNode left = TreeNode(preorder[idx]);
node->left = &left;
helper(node->left,start,dummy-1,preorder,inorder);
idx ++;
TreeNode right = TreeNode(preorder[idx]);
node->right = &right;
helper(node->right,dummy+1,end,preorder,inorder);
}
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
TreeNode root = TreeNode(preorder[0]);
helper(&root,0,preorder.size()-1,preorder,inorder);
return &root;
}
int main(int argc, const char * argv[]) {
// insert code here..
// build the tree
vector<int> preorder = {2,1,3};
vector<int> inorder = {1, 2, 3};
TreeNode* root = buildTree(preorder,inorder);
return 0;
}
什么都没有返回,当我尝试一步步调试的时候,发现函数退出时leftchild和rightchild的值都变了。我已经重写了代码并使用了新的 TreeNode,并且它有效。
但是我对之前的版本还是一头雾水。是不是我以前创建TreeNode的方式造成的?
我不熟悉 C++ 指针,所以任何提示都非常感谢!!
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
TreeNode root = TreeNode(preorder[0]);
helper(&root,0,preorder.size()-1,preorder,inorder);
return &root;
}
此处您返回的是本地创建的对象的地址(它将指向函数 returns 之后的某个随机内存位置)。您需要使用 new
在堆上创建根。例如:
TreeNode* root = new TreeNode(preorder[0]);
//stuff...
return root;
您的代码中存在更多错误...但修复上面的指针将是帮助您调试错误的第一步。
我正在尝试用 C++ 中的预序和忽略序列构建一个二叉树(无重复)。
编码如下:
#include <iostream>
#include <string>
#include <vector>
#include <cmath>
using namespace std;
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x): val(x),left(NULL),right(NULL) {}
};
int idx = 0; //idx in preorder
void helper(TreeNode* node,int start,int end, vector<int>& preorder, vector<int>& inorder) {
if (start == end) return;
int dummy;
for (dummy = 0; dummy<inorder.size(); dummy++) {
if (inorder[dummy] == node->val) {
break;
}
}
idx ++;
TreeNode left = TreeNode(preorder[idx]);
node->left = &left;
helper(node->left,start,dummy-1,preorder,inorder);
idx ++;
TreeNode right = TreeNode(preorder[idx]);
node->right = &right;
helper(node->right,dummy+1,end,preorder,inorder);
}
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
TreeNode root = TreeNode(preorder[0]);
helper(&root,0,preorder.size()-1,preorder,inorder);
return &root;
}
int main(int argc, const char * argv[]) {
// insert code here..
// build the tree
vector<int> preorder = {2,1,3};
vector<int> inorder = {1, 2, 3};
TreeNode* root = buildTree(preorder,inorder);
return 0;
}
什么都没有返回,当我尝试一步步调试的时候,发现函数退出时leftchild和rightchild的值都变了。我已经重写了代码并使用了新的 TreeNode,并且它有效。
但是我对之前的版本还是一头雾水。是不是我以前创建TreeNode的方式造成的?
我不熟悉 C++ 指针,所以任何提示都非常感谢!!
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
TreeNode root = TreeNode(preorder[0]);
helper(&root,0,preorder.size()-1,preorder,inorder);
return &root;
}
此处您返回的是本地创建的对象的地址(它将指向函数 returns 之后的某个随机内存位置)。您需要使用 new
在堆上创建根。例如:
TreeNode* root = new TreeNode(preorder[0]);
//stuff...
return root;
您的代码中存在更多错误...但修复上面的指针将是帮助您调试错误的第一步。