华电北风吹
天津大学计算机学院
日期:2016-08-22
本文总结一下二叉树的非递归遍历
基本数据结构参考代码
struct ValueType
{
int val;
};
struct Node
{
ValueType val;
Node* leftChild;
Node* rightChild;
Node(ValueType v, Node* l, Node* r)
{
val = v;
leftChild = l;
rightChild = r;
};
};
一、前序遍历
vector<ValueType> PreOrder(Node* root)
{
vector<ValueType> v;
stack<Node*> s;
if (root == NULL)
return v;
s.push(root);
while (s.empty()==false)
{
root = s.top();
s.pop();
v.push_back(root->val);
if (root->rightChild != NULL)
s.push(root->rightChild);
if (root->leftChild != NULL)
s.push(root->leftChild);
}
}
二、中序遍历
vector<ValueType> InOrder(Node* root)
{
vector<ValueType> v;
stack<Node*> s;
while ((root!=NULL)||(s.empty()==false))
{
while (root!=NULL)
{
s.push(root);
root = root->leftChild;
}
root = s.top();
s.pop();
v.push_back(root->val);
if (root->rightChild != NULL)
s.push(root->rightChild);
}
return v;
}
三、后序遍历
修改Node版本
struct Node
{
ValueType val;
Node* leftChild;
Node* rightChild;
bool visited;
Node(ValueType v, bool visited_, Node* l, Node* r)
{
val = v;
visited = visited_;
leftChild = l;
rightChild = r;
};
};
vector<ValueType> PostOrder(Node* root)
{
vector<ValueType> v;
stack<Node*> s;
if (root == NULL)
return v;
s.push(root);
while (s.empty() == false)
{
root = s.top();
if (root->visited == true)
{
v.push_back(root->val);
s.pop();
}
else
{
root->visited = true;
if (root->rightChild != NULL)
s.push(root->rightChild);
if (root->leftChild != NULL)
s.push(root->leftChild);
}
}
return v;
}
不修改Node版本
vector<ValueType> PostOrder(Node* root)
{
vector<ValueType> v;
if (root == NULL)
return v;
stack<Node*> s;
Node* pre = NULL;
s.push(root);
while (s.empty() == false)
{
root = s.top();
if (((root->leftChild == NULL) && (root->rightChild == NULL)) || (((pre != NULL) && (pre == root->rightChild || (pre == root->leftChild)))))
{
pre == root;
v.push_back(root->val);
s.pop();
}
else
{
if (root->rightChild != NULL)
s.push(root->rightChild);
if (root->leftChild != NULL)
s.push(root->leftChild);
}
}
return v;
}