我正在做一個 leetcode 問題,你可以在這里查看:https ://leetcode.com/problems/binary-tree-preorder-traversal 這 是我第一次回答,這是一個錯誤的答案:
class Solution {
public:
TreeNode* preorderTraversal(TreeNode* root, vector<int> &res){
if(root) res.push_back(root->val); else return nullptr;
if(root->left) return preorderTraversal(root->left,res);
if(root->right) return preorderTraversal(root->right,res);
return root;
}
vector<int> preorderTraversal(TreeNode* root) {
vector<int> res;
preorderTraversal(root,res);
return res;
}
};
這是我第二次通過測驗的答案:
class Solution {
public:
void preorderTraversal(TreeNode* root, vector<int> &res){
if(root) res.push_back(root->val); else return;
preorderTraversal(root->left,res);
preorderTraversal(root->right,res);
}
vector<int> preorderTraversal(TreeNode* root) {
vector<int> res;
preorderTraversal(root,res);
return res;
}
};
如果您有 leetcode 帳戶,您只需單擊上面的鏈接并將我的兩個答案復制到代碼區域并運行兩個答案,然后您可以找到像“[1,2,3]”這樣的輸入,它們代表樹每個樹節點中只有左分支,只能傳遞第二個代碼,而在第一個代碼中,最左邊的節點的值(在本例中為 3)不包含在問題要求的向量中。我想知道我的第一個答案有什么問題導致結果不同。
我知道第一個代碼看起來很奇怪而且乏味,我只是想知道為什么它不能正確作業。
我會非常感謝幫助我的你們。
uj5u.com熱心網友回復:
前序遍歷需要訪問樹中的所有節點。
在您的第一個版本中,您有以下幾行:
if(root->left) return preorderTraversal(root->left,res);
if(root->right) return preorderTraversal(root->right,res);
如果root->left不為空,return則將執行該陳述句,并在遞回呼叫preorderTraversal回傳后導致函式的執行結束。
這意味著如果不為空,則不會root->left訪問整個右子樹。
出于一致性原因,第二個if也是錯誤的(如果您永遠不應該回傳左子樹,則沒有理由回傳右子樹)。
您的第二個版本執行向左和向右(按該順序)的遞回,以確保根據預排序標準訪問所有節點。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/466748.html
上一篇:從后端取回資料后如何加載檔案二
