您的位置:首页 > 理论基础 > 数据结构算法

《算法导论》读书笔记之第10章 基本数据结构之二叉树

2013-01-27 12:02 417 查看
摘要

  书中第10章10.4小节介绍了有根树,简单介绍了二叉树和分支数目无限制的有根树的存储结构,而没有关于二叉树的遍历过程。为此对二叉树做个简单的总结,介绍一下二叉树基本概念、性质、二叉树的存储结构和遍历过程,主要包括先根遍历、中根遍历、后根遍历和层次遍历。

1、二叉树的定义

  二叉树(Binary Tree)是一种特殊的树型结构,每个节点至多有两棵子树,且二叉树的子树有左右之分,次序不能颠倒。

  由定义可知,二叉树中不存在度(结点拥有的子树数目)大于2的节点。二叉树形状如下下图所示:View Code

#include <iostream>
#include <stack>
#include <queue>
#include <cstdlib>
using namespace std;

typedef struct binary_tree_node
{
int elem;
struct binary_tree_node *left;
struct binary_tree_node *right;
}binary_tree_node,*binary_tree;

void init_binary_tree(binary_tree *root);
void create_binary_tree(binary_tree *root);
void preorder_traverse(binary_tree root);
void inorder_traverse(binary_tree root);
void inorder_traverse_two(binary_tree root);
void postorder_traverse(binary_tree root);
void levelorder_traverse(binary_tree root);

int main()
{
binary_tree root;
create_binary_tree(&root);
cout<<"preodrer traverse: ";
preorder_traverse(root);
cout<<"\ninodrer traverse: ";
inorder_traverse_two(root);
cout<<"\npostodrer traverse: ";
postorder_traverse(root);
cout<<"\nleverorder traverse: ";
levelorder_traverse(root);
exit(0);
}

void init_binary_tree(binary_tree *root)
{
*root = NULL;
}

void create_binary_tree(binary_tree* root)
{
int elem;
cout<<"Enter the node value(0 is end): ";
cin>>elem;
if(elem == 0)
*root = NULL;
else
{
*root = (binary_tree)malloc(sizeof(binary_tree_node));
if(NULL == root)
{
cout<<"malloc error.\n";
exit(-1);
}
(*root)->elem = elem;
cout<<"Creating the left child node.\n";
create_binary_tree(&((*root)->left));
cout<<"Createing the right child node.\n";
create_binary_tree(&((*root)->right));
}
}

void preorder_traverse(binary_tree root)
{
if(NULL != root)
{
stack<binary_tree_node*> s;
binary_tree_node *ptmpnode;
s.push(root);
while(!s.empty())
{
ptmpnode = s.top();
cout<<ptmpnode->elem<<" ";
s.pop();
if(NULL != ptmpnode->right)
s.push(ptmpnode->right);
if(NULL != ptmpnode->left)
s.push(ptmpnode->left);

}
}
}
void inorder_traverse(binary_tree root)
{
if(NULL != root)
{
stack<binary_tree_node*> s;
binary_tree_node *ptmpnode;
s.push(root);
while(!s.empty())
{
ptmpnode = s.top();
while(NULL != ptmpnode)
{
s.push(ptmpnode->left);
ptmpnode = s.top();
}
s.pop();
if(!s.empty())
{
ptmpnode = s.top();
cout<<ptmpnode->elem<<" ";
s.pop();
s.push(ptmpnode->right);
}
}
}
}

void inorder_traverse_two(binary_tree root)
{
if(NULL != root)
{
stack<binary_tree_node*> s;
binary_tree_node *ptmpnode;
ptmpnode = root;
while(NULL != ptmpnode || !s.empty())
{
//将左子树结点入栈
if(NULL != ptmpnode)
{
s.push(ptmpnode);
ptmpnode = ptmpnode->left;
}
else
{
//出栈遍历
ptmpnode = s.top();
s.pop();
cout<<ptmpnode->elem<<" ";
//右子树结点
ptmpnode = ptmpnode->right;
}
}
}
}

void postorder_traverse(binary_tree root)
{
if(NULL != root)
{
stack<binary_tree_node*> s;
binary_tree_node *ptmpnode;
int flags[100];
ptmpnode = root;
while(NULL != ptmpnode || !s.empty())
{
//将结点左子树结点入栈
while(NULL != ptmpnode)
{
s.push(ptmpnode);
flags[s.size()] = 0;   //标记未访问
ptmpnode=ptmpnode->left;
}
//输出访问的结点
while(!s.empty() && flags[s.size()] == 1)
{
ptmpnode = s.top();
s.pop();
cout<<ptmpnode->elem<<" ";
}
//从右子树开始遍历
if(!s.empty())
{
ptmpnode = s.top();
flags[s.size()] = 1;  //登记访问了
ptmpnode = ptmpnode->right;
}
else
break;
}
}
}
void levelorder_traverse(binary_tree root)
{
if(NULL != root)
{
queue<binary_tree_node*> q;
binary_tree_node *ptmpnode;
q.push(root);
while(!q.empty())
{
ptmpnode = q.front();
q.pop();
cout<<ptmpnode->elem<<" ";
if(NULL != ptmpnode->left)
q.push(ptmpnode->left);
if(NULL != ptmpnode->right)
q.push(ptmpnode->right);
}
}
}


程序测试结果如下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: