c++ - 为什么跳出函数后节点值变了?

标签 c++ pointers binary-tree inorder preorder

我正在尝试用 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;
}

什么都没有返回,当我试着一步一步调试的时候,我发现当我退出这个函数时,左 child 和右 child 的值发生了变化。我重写了代码并使用了新的 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;
}

这里你返回一个本地创建的对象的地址(函数返回后它将指向某个随机内存位置)。您需要使用 new 在堆上创建根目录。例如:

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

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

关于c++ - 为什么跳出函数后节点值变了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39557771/

相关文章:

c++ - 我似乎无法让我的 largestLength 递归函数工作

c++ - boost::dynamic_properties 和不可变图形对象

c - 如何在C中选择一个字符串数组?

c - 如何读取文本文件并将值存储到多个二叉树中

algorithm - 一道完全二叉树的算法题

c++ - HashMap 元素的值未正确打印

c++ - kevent.ident 是无符号整数,而文件描述符是有符号的?

c++ - 再次将指针传递给函数时遇到问题

c - 实现一个函数,该函数返回最长的 1 或 0 序列及其第一个索引

java - 无法从JAVA中的AVLTree获取高度