C++写二叉树
来源:互联网 发布:淘宝宝贝仓库在哪 编辑:程序博客网 时间:2024/06/14 16:16
在代码中都是使用的是递归来遍历二叉树,在这里面的代码中主要测试的是二叉树的插入和遍历insert()和preOrder(),inOrder(),postOrder();
#include<iostream>using namespace std;template <class Type> class BinaryTree;template <class Type> class BinTreeNode { friend class BinaryTree<Type>;public: BinTreeNode() :leftChild(NULL), rightChild(NULL) {} BinTreeNode(Type item, BinTreeNode<Type> *left = NULL, BinTreeNode<Type> *right = NULL) : data(item), leftChild(left), rightChild(right) {} Type GetData()const { return data; } BinTreeNode<Type> *GetLeft()const { return leftChild; } BinTreeNode<Type> *GetRight()const { return rightChild; } void setData(const Type &item) { data = item; } void SetLeft(BinTreeNode <Type>*L) { leftChild = L; } void SetRight(BinTreeNode<Type> *R) { rightChild = R; }private: BinTreeNode<Type> *leftChild, *rightChild; Type data;};template<class Type> class BinaryTree {public: BinaryTree() :root(NULL) {} BinaryTree(Type value) :RefValue(value), root(NULL) {} virtual ~BinaryTree() { destroy(root); } virtual int IsEmpty() { return root == NULL ? 1 : 0; } virtual BinTreeNode<Type> *Parent(BinTreeNode<Type>* current) { return root == NULL || root == current ? NULL : Parent(root, current); } virtual BinTreeNode <Type> *LeftChild(BinTreeNode<Type>*current) { return current != NULL ? current->leftChild : NULL; } virtual BinTreeNode<Type> *RightChild(BinTreeNode<Type> *current) { return current != NULL ? current->rightChild : NULL; } bool Insert(const Type &item);// virtual int Find(const Type &item)const; BinTreeNode<Type> *GetRoot()const { return root; } friend istream & operator >> (istream &in, BinaryTree<Type> &Tree); friend ostream & operator << (ostream &out, BinaryTree<Type> &Tree);public: BinTreeNode<Type> *root; Type RefValue; BinTreeNode<Type> *Parent(BinTreeNode<Type>*start, BinTreeNode<Type>*current); void preOrder(BinTreeNode<Type> *current); void inOrder(BinTreeNode<Type> *current); void postOrder(BinTreeNode<Type> *current); void destroy(BinTreeNode<Type> *current);};template<class Type> void BinaryTree<Type>::destroy(BinTreeNode<Type>*current) { if (current != NULL) { destroy(current->leftChild); destroy(current->rightChild); delete current; }}template<class Type> bool BinaryTree<Type>::Insert(const Type &item) { if (root == NULL) { root = new BinTreeNode<Type>(item); } else { BinTreeNode<Type> *parent = NULL; BinTreeNode<Type> *p = root; while (p != NULL) { if (item<p->data) { parent = p; p = p->leftChild; } else if (item>p->data) { parent = p; p = p->rightChild; } else { return false; } } if (item<parent->data) parent->leftChild = new BinTreeNode<Type>(item); else parent->rightChild = new BinTreeNode<Type>(item); } return true;}//寻找parent节点template <class Type> BinTreeNode <Type> * BinaryTree <Type> ::Parent(BinTreeNode <Type> * start, BinTreeNode <Type> *current) { if (start == NULL) return NULL; if (start->leftChild == current || start->rightChild == current) return start; BinTreeNode <Type> *p; if ((p = Parent(start->leftChild, current)) != NULL) return p; else return Parent(start->rightChild, current);}//将二叉树输出template <class Type> void BinaryTree<Type>::preOrder( BinTreeNode <Type> *current){ if (current != NULL) { cout << current->data << ' '; preOrder(current->leftChild); preOrder(current->rightChild); }}template <class Type> void BinaryTree<Type>::inOrder(BinTreeNode <Type> *current) { if (current != NULL) { inOrder(current->leftChild); cout << current->data << ' '; inOrder(current->rightChild); }}template <class Type> void BinaryTree<Type>::postOrder(BinTreeNode <Type> *current) { if (current != NULL) { postOrder(current->leftChild); postOrder(current->rightChild); cout << current->data << ' '; }}template <class Type> istream & operator >> (istream & in, BinaryTree<Type> &Tree) { Type item; cout << "构造二叉树 : \n "; cout << "输入数据 ( 用 " << Tree.RefValue << "结束 ): "; in >> item; while (item != Tree.RefValue) { Tree.Insert(item); cout << "输入数据 ( 用 " << Tree.RefValue << "结束 ): "; in >> item; } return in;}template <class Type> ostream & operator << (ostream &out, BinaryTree<Type> &Tree) { out << "二叉树的前序遍历.\n"; Tree.Traverse(Tree.root, out); out << endl; return out;}int main() { BinaryTree<int> BT; BT.Insert(4); BT.Insert(3); BT.Insert(5); BT.Insert(2); BT.Insert(6); cout << BT.GetRoot()->GetData() << endl; BT.preOrder(BT.GetRoot()); cout << endl; BT.inOrder(BT.GetRoot()); cout << endl; BT.postOrder(BT.GetRoot()); cout << endl; getchar(); return 0;}
阅读全文
0 0
- C++写二叉树
- 自己动手写二叉平衡树
- 一步一步写二叉查找树
- 一步一步写二叉查找树
- C语言版--二叉树
- btree-C二叉树
- 数据结构(C++)--二叉树
- C二叉树
- C语言版--二叉树
- 二叉查找树(C#)
- C语言 二叉树
- c的二叉树
- 二叉树 c实现
- 二叉树(数据结构 c++)
- c语言 二叉树
- 二叉树(C++)
- [c]二叉树
- 【数据结构】二叉树(c++)
- 封装:Eclipse油藏数值模拟源文件解析封装
- C语言可变参数--va_list、va_start、va_arg、va_end
- Screen, Viewport 和 Rect 浅析
- Boolan STL与泛型编程 第四周笔记
- Centos7 安装go语言开发环境
- C++写二叉树
- Netty protobuf的编解码使用
- 2017.6.15
- PNP: non-blocking IO
- 树形dp——洛谷 P2986 [USACO10MAR]伟大的奶牛聚集Great Cow Gat…
- codeforces—— 579A —— Raising Bacteria
- latex 加减号堆积,放在一起
- 好好用心学好JAVA语言
- Linux 正则表达式详解