广义表法建立二叉树
来源:互联网 发布:刘亦菲牙齿知乎 编辑:程序博客网 时间:2024/06/06 12:25
一直以来对树稍微存在一点儿恐惧感,最近打算好好顺一顺数据结构,于是从二叉树开始对树进行研究。这个方法主要参考殷人昆第二版的数据结构(清华大学出版社第二版)。实现也都是用模板,后来的实例是用char型。其中涉及到友员函数和操作符重载的使用,这一块有点儿忘了,就当复习了一下。
/*********************************date:2014.5.10author:andrew**********************************///BinTree.h#include<iostream>using namespace std;template<class T>//definition of the node of binary treestruct BinTreeNode{T data; //dataBinTreeNode<T>* lChild, *rChild; //pointer points to left child and right childBinTreeNode() :lChild(NULL), rChild(NULL){};//constructorBinTreeNode(T d, BinTreeNode<T> *l=NULL, BinTreeNode<T>*r=NULL){data = d;lChild = l;rChild=r;}};template<class T>//class definitionclass BinTree{public:BinTree() :root(NULL){}BinTree(T data){value = data;root = NULL;}~BinTree(){destroy(root);}int Size(){return Size(root);}bool isEmpty(){return (root == NULL) ? true : false;}BinTreeNode<T> *Parent(BinTreeNode<T> *current){return (root == NULL || current == root) ? NULL : Parent(root,current);}BinTree<T> *LeftChild(BinTreeNode<T> *current){return (current != NULL) ? current->lChild : NULL;}BinTree<T> *RightChild(BinTreeNode<T> *current){return (current != NULL) ? current->rChild : NULL;}BinTreeNode<T> *getRoot(){return root;}void CreateBinTree(istream& in,BinTreeNode<char> *subtree);private:BinTreeNode<T> *root;T value;void destroy(BinTreeNode<T> *subTree);BinTreeNode<T> *Parent(BinTreeNode<T>*subTree,BinTreeNode<T>*current);public:void Traverse(BinTreeNode<T> *subTree, ostream& out);friend istream& operator>>(istream& in,BinTree<char>& Tree);friend ostream& operator<<(ostream& out, BinTree<char>& Tree);};
//BinTree.cpp#include"BinTree.h"#include<iostream>#include<stack>using namespace std;template<class T>void BinTree<T>::destroy(BinTreeNode<T> *subTree){if (subTree != NULL){destroy(subTree->lChild);//delete left subTree recucivelydestroy(subTree->rChild); //delete right subTree recucivelydelete subTree;}}template<class T>BinTreeNode<T> *BinTree<T>::Parent(BinTreeNode<T> *subTree, BinTreeNode<T> *current){if (subTree == NULL)return NULL;if (subTree->lChild == current || subTree->rChild == current)return subTree;return Parent(subTree->lChild, current);return Parent(subTree->rChild, current);}//create binary tree using generalized listvoid CreateBinTree(istream& in, BinTreeNode<char> *&subTree){stack<BinTreeNode<char> *>s;subTree = NULL;BinTreeNode<char> *p, *t;int k; //tag,1 for left,2 for rightint count = 0; //index of string,point to the current handlingchar ch;in >> ch;while (ch != '#'){switch (ch){case '(':{s.push(p);k = 1;break;}case ')':{t = s.top();s.pop();break;}case ',':{k = 2;break;}default:{ p = new BinTreeNode<char>(ch); if (subTree == NULL) subTree = p; else if (k == 1) { t = s.top(); t->lChild = p; } else { t = s.top(); t->rChild = p; }}}in >> ch;}cout << "Create successfully!" << endl;}template<class T>void BinTree<T>::Traverse(BinTreeNode<T>*subTree, ostream&out){if (subTree != NULL){out << subTree->data << " ";Traverse(subTree->lChild, out);Traverse(subTree->rChild, out);}}//template<class T>istream& operator>>(istream& in, BinTree<char>&Tree){CreateBinTree(in, Tree.root);return in;}//template<class T>ostream& operator<< (ostream&out, BinTree<char>&Tree){out << "Traverse the binary tree:" << endl;Tree.Traverse(Tree.root, out);out << endl;return out;}int main(){BinTree<char> bintree;BinTreeNode<char> *bTreeNode = NULL;cout << "Input generalized list,end with#:" << endl;cin >> bintree;cout << bintree;return 0;}
测试结果:
0 0
- 广义表法建立二叉树
- 广义表建立二叉树
- 广义表建立二叉树
- 输入二叉树的广义表建立二叉树
- 输入二叉树的广义表形式建立二叉树+C++
- 广义表创建二叉树
- 二叉树的建立(广义表)及3种遍历
- 二叉树的广义表形式
- 广义表的二叉树的形式
- 二叉树的广义表形式
- 使用广义表创建二叉树
- 数据结构之广义表和二叉树
- 广义表和二叉树的转换
- 根据广义表构建二叉树
- 建立广义表的算法
- 二叉树采用二叉链表结构表示。设计并实现如下算法:输入某棵二叉树的广义表形式,建立该二叉树,并按层次遍历该二叉树。
- 利用广义表非递归构造二叉树
- 数据结构与算法简记:根据广义表构建二叉树
- listview 上拉加载更多
- TMS320C64x+ DSP-----Cache 优化
- 数论模版
- 工作问题积累(十八)VC界面编程总结
- 【玩转微信公众平台之三】 基本操作
- 广义表法建立二叉树
- 全志A20一些具体工作
- DSP优化,通用的调整性能的策略
- vcs的plusagrs使用技巧
- 一个C#程序,用到了双向链表
- 浅谈PHP 5中垃圾回收算法的演化
- 智慧城市,在中国的北海边再画一个圈——大连“中国首届智慧城市协同创新峰会”请你带好笔
- 整数到的进制
- 深入分析Java I/O工作机制