2016-09-18 2 views
1

나는 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; 
} 

, 나는 그것을 단계적으로 디버깅하려고 할 때, 나는 내가 나왔을 때 왼쪽 자식과 오른쪽 아이의 값이 변경 것을 발견 :

코딩은 다음과 같습니다 기능. 코드를 다시 작성하고 새 TreeNode를 사용하면 작동합니다.

하지만 이전 버전에서는 여전히 혼란 스럽습니다. TreeNode를 생성하는 방식으로 인해 발생합니까?

저는 C++ 포인터에 익숙하지 않으므로 힌트를 얻으실 수 있습니다 !!

답변

3
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; 

이 코드에서 좀 더 실수를 존재 ...하지만 당신이 그 (것)를 디버깅 할 수 있도록하는 첫 번째 단계가 될 것입니다 위의 포인터를 고정.

+1

'left'와'right'도 마찬가지입니다. –

관련 문제