【数据结构】二叉树的遍历
二叉树是每个结点最多有两个子树的有序树。通常子树的根被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用作二叉查找树和二叉堆或是二叉排序树。二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒。
二叉树的遍历包括深度优先和宽度优先,深度优先又有前序,中序遍历和后序遍历三种。
对于深度优先遍历,递归遍历方法直观而简洁,如果要使用非递归方法,一般要借用栈结构;
宽度优先则常使用队列来实现。
#include
using namespace std;
template
class TreeNode
{
protected:
TreeNode* left;
TreeNode* right;
public:
T data;
TreeNode (const T& item, TreeNode *lptr,TreeNode *rptr):
data(item), left(lptr), right(rptr) {}
virtual ~TreeNode() {}
TreeNode* Left() const {
return left;
}
TreeNode* Right() const {
return right;
}
//递归遍历
void Preorder(TreeNode *const node )const ;
void Inorder(TreeNode *const node )const ;
void Postorder(TreeNode *const node)const;
void Preorder() {
Preorder(this);
}
void Inorder() {
Preorder(this);
}
void Postorder() {
Preorder(this);
}
//非递归遍历
void PreTraverse(TreeNode *const node )const ;
void InTraverse(TreeNode *const node )const ;
void PostTraverse(TreeNode *const node)const;
void PreTraverse() {
PreTraverse(this);
}
void InTraverse() {
InTraverse(this);
}
void PostTraverse() {
PostTraverse(this);
}
};
// preorder recursive scan of the nodes in a tree
template
void TreeNode::Preorder (TreeNode *const t) const
{
if (t != NULL) {
cout << t->data << " "; // visit the node
Preorder (t->Left()); // descend left
Preorder (t->Right()); // descend right
}
}
// inorder recursive scan of the nodes in a tree
template
void TreeNode::Inorder (TreeNode*const t) const
{
if (t != NULL) {
Inorder (t->Left()); // descend left
cout << t->data << " "; // visit the node
Inorder (t->Right()); // descend right
}
}
// postorder recursive scan of the nodes in a tree
template
void TreeNode::Postorder (TreeNode *const t) const
{
if (t != NULL) {
Postorder (t->Left()); // descend left
Postorder(t->Right()); // descend right
cout << t->data << " "; // visit the node
}
}
template
void TreeNode::PreTraverse(TreeNode *const node ) const
{
if (node == NULL)
return;
TreeNode *t = node;
stack< TreeNode* > s;
s.push(t);
while (! s.empty()) {
t = s.top();
s.pop();
cout << t->data << " ";
if(t->right != NULL)
s.push(t->right);
if(t->left != NULL)
s.push(t->left);
}
}
template
void TreeNode::InTraverse(TreeNode *const node ) const
{
if (node == NULL)
return;
TreeNode *t = node;
stack< TreeNode* > s;
do {
while(t != NULL) {
s.push(t);
t = t->left;
}
t = s.top();
s.pop();
cout << t->data << " ";
t = t->right;
} while (!s.empty()|| t!=NULL);
}
template
void TreeNode::PostTraverse(TreeNode *const node ) const
{
stack<TreeNode* > s;
stack sf;
TreeNode *t = node;
int flag;
while (!s.empty() || t!=NULL){
while (t!=NULL){
s.push(t);
sf.push(0);
t = t->left;
}
t = s.top(),s.pop();
flag = sf.top(),sf.pop();
if (flag == 0) {
s.push(t);
sf.push(1);
t = t->right;
}else {
cout << t->data << " ";
t = NULL;
}
}
}一个简单的测试程序
1 int main()
2 {
3 TreeNode<int> n1(10,NULL,NULL);
4 TreeNode<int> n2(9,NULL,NULL);
5 TreeNode<int> n3(6,&n1,&n2);
6 TreeNode<int> n4(7,NULL,NULL);
7 TreeNode<int> n5(8,NULL,NULL);
8 TreeNode<int> n6(3,&n4,&n5);
9 TreeNode<int> n7(1,&n3,&n6);
10
11 n7.PreTraverse(); cout << endl;
12 n7.InTraverse(); cout << endl;
13 n7.PostTraverse();cout << endl;
14
15 system("pause");
16 return 0;
17 }
2 {
3 TreeNode<int> n1(10,NULL,NULL);
4 TreeNode<int> n2(9,NULL,NULL);
5 TreeNode<int> n3(6,&n1,&n2);
6 TreeNode<int> n4(7,NULL,NULL);
7 TreeNode<int> n5(8,NULL,NULL);
8 TreeNode<int> n6(3,&n4,&n5);
9 TreeNode<int> n7(1,&n3,&n6);
10
11 n7.PreTraverse(); cout << endl;
12 n7.InTraverse(); cout << endl;
13 n7.PostTraverse();cout << endl;
14
15 system("pause");
16 return 0;
17 }

浙公网安备 33010602011771号