Почему значение узла изменилось при выходе из функции?

Я пытаюсь построить двоичное дерево (без дублирования) с его последовательностью предзаказа и игнорирования в 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;
}

Он ничего не возвращал, и когда я попытался отладить его шаг за шагом, я обнаружил, что значение left и right child изменилось, когда я вышел из функции. Я переписал код и использую новый TreeNode, и он работает.

Но я все еще запутался в предыдущей версии. Это вызвано тем, как я использовал для создания TreeNode?

Я не знаком с указателем C ++, поэтому любые советы приветствуются!

1

Решение

TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
TreeNode root = TreeNode(preorder[0]);
helper(&root,0,preorder.size()-1,preorder,inorder);
return &root;
}

Здесь вы возвращаете адрес локально созданного объекта (он будет указывать на некоторую случайную ячейку памяти после возврата из функции). Вам нужно использовать new сделать рут в куче. например.:

TreeNode* root = new TreeNode(preorder[0]);
//stuff...
return root;

В вашем коде есть немного больше ошибок … но исправление указателя выше будет первым шагом, который поможет вам их отладить.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]