二叉树的构造与遍历—先根构造,一维数组存储按层构造,先根,中根,后根遍历输出
2011-03-03 13:59
393 查看
// bTreeNode.h #include <iostream> template <class Type> class bTree; template <class Type> class bTreeNode { friend class bTree<Type>; // this template class is not a common used template class // it is used only in template class bTree private: bTreeNode(): data(Type()), lchild(NULL), rchild(NULL) { } Type data; bTreeNode* lchild; bTreeNode* rchild; };
// bTree.h #include "bTreeNode.h" template <class Type> class bTree { public: bTree() // constructor for first root input node, { // when left/right child is empty input child node // data '#' root = new bTreeNode<Type>; PreOrderCreate(root); } bTree(Type* q, int n) { root = new bTreeNode<Type>; LeverCreate(root, q, 0, n); } void PrintPreOrder() // print preorder { PreOrder(root); std::cout << std::endl; } void PrintInOrder() // print inorder { InOrder(root); std::cout << std::endl; } void PrintPostOrder() // print postorder { PostOrder(root); std::cout << std::endl; } private: void PreOrderCreate(bTreeNode<Type>* p) // create tree preorder { std::cin >> p->data; if ('#' != p->data) { p->lchild = new bTreeNode<Type>; p->rchild = new bTreeNode<Type>; PreOrderCreate(p->lchild); if ('#' == p->lchild->data) { delete p->lchild; p->lchild = NULL; } PreOrderCreate(p->rchild); if ('#' == p->rchild->data) { delete p->rchild; p->rchild = NULL; } } else { } } void LeverCreate(bTreeNode<Type>* p, Type* q, int i, int n) { if ('#' != q[i] && i < n) { p->data = q[i]; p->lchild = new bTreeNode<Type>; p->rchild = new bTreeNode<Type>; LeverCreate(p->lchild, q, 2 * i + 1, n); if ('/0' == p->lchild->data) { delete p->lchild; p->lchild = NULL; } LeverCreate(p->rchild, q, 2 * i + 2, n); if ('/0' == p->rchild->data) { delete p->rchild; p->rchild = NULL; } } } void PreOrder(bTreeNode<Type>* p) // first root print { if (NULL != p) { std::cout << p->data << " "; PreOrder(p->lchild); PreOrder(p->rchild); } } void InOrder(bTreeNode<Type>* p) // middle root print { if (NULL != p) { InOrder(p->lchild); std::cout << p->data << " "; InOrder(p->rchild); } } void PostOrder(bTreeNode<Type>* p) // post-root print { if (NULL != p) { PostOrder(p->lchild); PostOrder(p->rchild); std::cout << p->data << " "; } } private: bTreeNode<Type>* root; };
// main.cpp #include "bTree.h" int main() { // the below three trees is one tree // '#' means a node has no left/right child // one lever array store. char* cc = "abcdeg###f##h"; bTree<char> a(cc, 13); a.PrintPreOrder(); a.PrintInOrder(); a.PrintPostOrder(); // first root // enter abd##ef###cg#h### bTree<char> b; b.PrintPreOrder(); b.PrintInOrder(); b.PrintPostOrder(); // '#' asc code is equal to 35 // a b d # # e f # # # c g # h # # # // 97 98 100 35 35 101 102 35 35 35 99 103 35 104 35 35 35 bTree<int> c; c.PrintPreOrder(); c.PrintInOrder(); c.PrintPostOrder(); return 0; }
相关文章推荐
- 将一棵二叉树的所有结点存储在一维数组中,虚结点用#表示,利用性质5
- 使用一维数组存储二叉树--Java版
- 二叉树用数组顺序存储(完全二叉树)并实现三种遍历,代码详解!!!
- 【BST】根据前序遍历的数组构造搜索二叉树
- 二叉树数组顺序存储与遍历
- 二叉树的一维数组存储
- 前序遍历用一维数组表示的二叉树
- 6.33③ 假定用两个一维数组L[1..n]和R[1..n]作为 有n个结点的二叉树的存储结构, L[i]和R[i]分别指 示结点i的左孩子和右孩子,0表示空。试写一个算法 判别结点u是否为结点v的
- 用数组构造一个二叉树
- 数据结构-二叉树的存储结构与遍历
- 遍历二叉树,利用栈和只用固定存储空间,递归和非递归。
- 二叉树的链式存储,先序建树,以及4种遍历方式
- Java链表来存储二叉树和(前中后序)遍历二叉树--Java版
- 优先队列,由于优先队列的树形结构是完全二叉树,所以可以使用数组的形式去存储,我的上一个博客是用二叉树的形式去存储优先队列的
- N阶三对角矩阵按行优先顺序压缩存储到一维数组中
- 二叉树 三种遍历构造二叉树+层次遍历 题目 PAT 树的遍历
- php FLEA中二叉树数组的遍历输出
- 【九度】由前序和中序构造二叉树并求后序遍历
- Sicily---1156. Binary tree(树的数组存储,遍历,集合操作)
- 二叉树的存储方式以及递归和非递归的三种遍历方式