145バイナリツリートラバーサル後順***
https://leetcode.com/problems/binary-tree-postorder-traversal/
タイトル説明
バイナリツリーを考えると、返却後順トラバーサルそのノードの値のを。
例:
Input: [1,null,2,3]
1
\
2
/
3
Output: [3,2,1]
フォローアップ:再帰的な解決策は簡単です、あなたは繰り返しそれを行うだろうか?
C ++の実装1
再帰形;この質問は、書き込み再帰的にあなたの能力をテストするためではないハードとしてマークされています...
class Solution {
private:
vector<int> res;
void postorder(TreeNode *root) {
if (!root) return;
postorder(root->left);
postorder(root->right);
res.push_back(root->val);
}
public:
vector<int> postorderTraversal(TreeNode* root) {
postorder(root);
return res;
}
};
C ++での2
反復形と先行順走査(横断した後144ザ・バイナリツリートラバーサル予約限定!**を次のように)、実際にはほぼ同じです。
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
if (!root) return {};
vector<int> res;
stack<TreeNode*> st;
TreeNode *p = root;
while (!st.empty() || p) {
if (p) {
st.push(p);
res.push_back(p->val);
p = p->right;
} else {
auto cur = st.top();
st.pop();
p = cur->left;
}
}
std::reverse(res.begin(), res.end());
return res;
}
};
先行順走査(あるしかし違い、144バイナリツリートラバーサル予約限定**)逆の形。
使用するp
場合、現在の訪問を表すノードがp
空でないその後に添加し、res
次いで、p
第1の右の部分木を指し、そして、左サブツリーを指す。この場合、res
ノードは順に格納されている[根节点, 右子树节点, 左子树节点]
最後限り、res
フリップ。
while
ループ部分が引き出され、スタックの関連部分を除去し、得られた先行順走査の結果を比較しました。
// 后序遍历的结果
if (p) {
res.push_back(p->val);
p = p->right;
} else {
p = cur->left;
}
std::reverse(res.begin(), res.end());
// 前序遍历的结果
if (p) {
res.push_back(p->val);
p = p->left;
} else {
p = cur->right;
}
我々は明確な接続と違いを見ることができます。