著者: シャオ・ルー
コラム:「リートコード」
好きな言葉:立ち上がる若者のおかげで世界はもっと美しい。—— 『人民日報』
144. バイナリツリーの事前注文トラバーサル
トピック:
バイナリ ツリーのルート ノードを指定すると 、root
そのノード値の 事前順序 走査を返します。
例:
アイデア:
バイナリ ツリーの最後まで進むと、左端のパスができ、これを左サブパスと呼びます。バイナリ ツリーを左サブパスと右サブパスに分割できます。左サブパスノードなど。
スタックを使用して左側のサブウェイを保存し、最後に到達した場合はスタックの最上部をポップアウトし、スタックの最上部にある右側のサブツリーをトラバースして循環します。
コード:
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
stack<TreeNode*>st;
vector<int>v;
TreeNode*cur=root;
while(cur||!st.empty())
{
while(cur)
{
st.push(cur);
v.push_back(cur->val);
cur=cur->left;
}
TreeNode*top=st.top();
st.pop();
cur=top->right;
}
return v;
}
};
94. 二分木のインオーダートラバース
トピック:
バイナリ ツリーのルート ノードを指定すると root
、 その 順序 トラバーサルを返します。
例:
コード:
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
stack<TreeNode*>st;
vector<int>v;
TreeNode*cur=root;
while(cur||!st.empty())
{
while(cur)
{
st.push(cur);
cur=cur->left;
}
TreeNode*top=st.top();
st.pop();
v.push_back(top->val);
cur=top->right;
}
return v;
}
};
145. 二分木の事後走査
トピック:
バイナリ ツリーのルート ノードを指定すると root
、 そのノード値の事後探索を 返します。
例:
コード:
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
stack<TreeNode*>st;
vector<int>v;
TreeNode*cur=root;
TreeNode*prev=nullptr;
while(cur||!st.empty())
{
//左子路
while(cur)
{
st.push(cur);
cur=cur->left;
}
//从栈里面取到左子路的节点
TreeNode*top=st.top();
//这里右不存在或者右子树已经遍历了,才可以
//prev记录上一个节点,如果prev是top的父亲,就说明右子树已经遍历了
if(top->right==nullptr||top->right==prev)
{
v.push_back(top->val);
st.pop();
prev=top;
}
else
{
cur=top->right;
}
}
return v;
}
};