先序遍歷
void preOrderS(Node* root)
{
stack<Node*> s;
Node* p = root;
while (p || !s.empty())
{
while (p)
{
cout << p->data;
s.push(p);
p = p->left;
}
if (!s.empty())
{
p = s.top();
s.pop();
p = p->right;
}
}
}
思路:令p=root,不斷將p=p->left,並打印節點,也就是不停的取左節點直到爲空。如果發現p爲空,那麼說明已經到了最左節點,出棧之後p=p->right,繼續循環判斷。
中序遍歷
void inOrderS(Node* root)
{
stack<Node*> s;
Node* p = root;
while (p || !s.empty())
{
while (p)
{
s.push(p);
p = p->left;
}
if (!s.empty())
{
p = s.top();
s.pop();
cout << p->data;
p = p->right;
}
}
}
思路:和前序遍歷非常像。令p=root,不斷將p=p->left,也就是不停的取左節點直到爲空。如果發現p爲空,那麼就說明已經到了最左節點,出棧並打印當前節點,之後p=p->right,繼續循環判斷。
後序遍歷
void preOrderS(Node* root)
{
stack<Node*> s1;
stack<Node*> s2;
Node* p = root;
s1.push(p);
while (!s1.empty())
{
p = s1.top();
s1.pop();
s2.push(p);
if (p->left)s1.push(p->left);
if (p->right)s1.push(p->right);
}
while (!s2.empty())
{
cout << s2.top();
s2.pop();
}
}
思路:用兩個棧,先將頭結點入棧s1。之後將該節點出棧s1,入棧s2,同時將該節點的左孩子入棧,右孩子入棧。依次判斷s1棧頂中節點是否有左右孩子,如果沒有則入棧s2,往復循環。最終依次出s2棧即爲後序遍歷。