关于预订树遍历

时间:2017-06-19 15:34:33

标签: c++

我为递归二叉树预订遍历编写了以下代码片段:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
private:
    std::vector<int> myVec;
public:
    vector<int> preorderTraversal(TreeNode* root) {
        if(root==NULL)
            return vector<int>();

        myVec.push_back(root->val);
        preorderTraversal(root->left);
        preorderTraversal(root->right);

        return myVec;
    }
};

虽然此代码运行并产生预期的输出,但我不完全确定这是否正确;因为当我致电preorderTraversal(root->left);preorderTraversal(root->right);时,我没有使用他们返回的值(vector<int> s)。所以,

  1. 这是对的吗?
  2. 如果不是,那么我该如何纠正这段代码?

1 个答案:

答案 0 :(得分:3)

是的,如果你打电话一次是正确的。如果不是,则不清除myVec向量。

事实上,每次调用preorderTraversal,除了顶部和从左到右的路径,都会返回一些没有多大意义的中间状态。如果我是你,我会重构这段代码来隐藏类中的中间值:

class Solution {
private:
    std::vector<int> myVec;

    void traverse(TreeNode* root) {
        if (root == NULL)
            return;

        myVec.push_back(root->val);
        preorderTraversal(root->left);
        preorderTraversal(root->right);
    }

public:
    vector<int> preorderTraversal(TreeNode* root) {
        myVec.clear();
        traverse(root);
        return myVec;
    }
};