《算法导论》读书笔记之第10章 基本数据结构之二叉树
2013-01-27 12:02
417 查看
摘要
书中第10章10.4小节介绍了有根树,简单介绍了二叉树和分支数目无限制的有根树的存储结构,而没有关于二叉树的遍历过程。为此对二叉树做个简单的总结,介绍一下二叉树基本概念、性质、二叉树的存储结构和遍历过程,主要包括先根遍历、中根遍历、后根遍历和层次遍历。
1、二叉树的定义
二叉树(Binary Tree)是一种特殊的树型结构,每个节点至多有两棵子树,且二叉树的子树有左右之分,次序不能颠倒。
由定义可知,二叉树中不存在度(结点拥有的子树数目)大于2的节点。二叉树形状如下下图所示:View Code
程序测试结果如下:
书中第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); } } }
程序测试结果如下:
相关文章推荐
- 《算法导论》读书笔记之第10章 基本数据结构
- 算法导论第10章 基本数据结构之二叉树
- 算法导论 第10章 基本数据结构
- 算法导论学习笔记——第10章 基本数据结构
- 算法导论------------基本数据结构之二叉树
- 算法导论代码 第10章 基本数据结构
- 算法导论第10章 基本数据结构
- 算法导论答案 第10章:基本数据结构
- 《算法导论》第10章 基本数据结构 (2)链表
- 《算法导论》第10章 基本数据结构 (2)链表
- 《算法导论》第10章 基本数据结构 (2)链表
- 《算法导论》第10章 基本数据结构 (2)链表
- 算法导论第10章-基本数据结构-10.1栈和队列
- 算法导论 第十章 基本数据结构
- 第10章,基本数据结构(栈,队列)
- 算法导论第10章基本数据结构10.1栈
- 《算法导论》 — Chapter 10 基本数据结构
- C语言基本数据结构之四(线性,对分,二叉树查找及二叉树删除)
- 栈与队列_第10章_基本数据结构_算法导论
- 【数据结构】二叉树的基本操作