【问题标题】:Why the node value changed when get out of the function?为什么退出函数时节点值会发生变化?
【发布时间】:2016-09-18 12:46:37
【问题描述】:

我正在尝试用 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 child和right child的值发生了变化。我已经重写了代码并使用了新的 TreeNode,它可以工作了。

但我仍然对以前的版本感到困惑。是不是我以前创建TreeNode的方式造成的?

我对 C++ 指针不熟悉,因此不胜感激!

【问题讨论】:

    标签: c++ pointers binary-tree inorder preorder


    【解决方案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;
    

    您的代码中存在更多错误...但修复上面的指针将是帮助您调试它们的第一步。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-04
      • 2014-11-21
      相关资源
      最近更新 更多