/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
TreeNode* insertIntoBST(TreeNode* root, int val) {
TreeNode*& node = find(root, val);
node = new TreeNode(val);
return root;
}
TreeNode*& find(TreeNode*& root, int& val) {
if (root == nullptr) return root;
else if (root->val > val) return find(root->left, val);
else return find(root->right, val);
}
};
我正在學習 C 并在講座幻燈片上閱讀此代碼。該代碼是關于將新節點插入二叉搜索樹的。這個想法是找到目標位置,然后在該位置插入一個新節點。我可以理解“查找”函式回傳“指標參考”型別的原因。我認為是因為我們需要在'find'函式回傳后修改目標位置的地址。但是,我不知道為什么我們在將根節點傳遞給“查找”函式時也需要使用“指標參考”型別。如果我將 TreeNode*& find(TreeNode*& root, int& val) 更改為 TreeNode*& find(TreeNode* root, int& val),程式將回傳原始樹而不插入目標。任何人都可以幫助解決這個問題嗎?先感謝您!
uj5u.com熱心網友回復:
如果您更改find為TreeNode*& find(TreeNode* root, int& val)然后查看函式的第一行:
if (root == nullptr) return root;
這將回傳對區域變數的參考。更改它insertIntoBST是未定義的行為,不會更改root內部的變數insertIntoBST。
將第一個值插入空樹時,逐步瀏覽代碼:
NodeTree *tree = nullptr;
tree = insertIntoBST(tree, 42);
該insertIntoBST函式可以使用與查找和修改根相同的技巧:
void insertIntoBST(TreeNode*& root, int val) {
TreeNode*& node = find(root, val);
node = new TreeNode(val);
}
NodeTree *tree = nullptr;
insertIntoBST(tree, 42);
insertIntoBST(tree, 23);
insertIntoBST(tree, 666);
甚至更短:
void insertIntoBST(TreeNode*& root, int val) {
find(root, val) = new TreeNode(val);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/470448.html
