C++ 基础内容, 不值一提 Author:Jacky Wu 2006-5-15 引用该文章,必须注明其出处 http://blog.youkuaiyun.com/imwkj
二叉树是一个非常重要的数据结构,很多教材上并没有提到如何通过字符串或者其他形式来生成二叉树。 本人实现的二叉树类提供了如下功能 1:由前序字串生成二叉树 2:由后续字串生成二叉树 3:提供三种迭代器,用于遍历二叉树 文件 test.cpp 是对二叉树接口的测试,文件BinaryTree.h是二叉树模板的实现,其中用到了链栈,myStack.h 在以前的文章提到过,并且也提供了代码
在BinaryTree.h 定义了几个类 BinTreeNode :二叉树节点类,带父节点 BinaryTree : 二叉树类 BinaryTree::iterator; //迭代器基类 BinaryTree::PreOrder_iterator; //前序迭代器 BinaryTree::InOrder_iterator; //中序迭代器 BinaryTree::PostOrder_iterator; //后序迭代器 * Copyright (c) 2006 * Jacky Wu * You can use these source code for any purpose. * And It is provided "as is" without express or implied warranty. * * 你可以任意使用该代码,但是本人不对代码的安全性做任何担保!!! * * 由于大部分代码是出于学习目的实现的,只是让它“可以使用", * 并没有经过安全性,高负荷运行强度等测试,我必须对这些代码做一个声明: * !!!! * 免责声明: * 对于使用在本blog上提供的任意“形式”(包括测试,类的实现, * 系统的分析 等等只要是代码片断)的代码造成系统不稳定或者 * 由于此造成的经济、声誉上的损失,或者是人身伤害等任何损失,本人不负任何法律责任
|
//文件 test.cpp
#include "BinaryTree.h"
#include <iostream>
using namespace std;
int main() { BinaryTree<char> tree;
//前序字符串 string str = "ABC#D##E#F##GH#I##JK##L##";
//后续字符串 //string str = "###DC###FEB###IH##K##LJGA";
//前序方法生成二叉树 tree.PreOrderCreateTree(str);
cout << "EXP STR: " << str << endl;
//前序方法遍历打印二叉树 tree.PreOrder();
//中序打印二叉树 tree.InOrder();
//后续打印二叉树 tree.PostOrder();
cout << "Tree Height:" << tree.Height() << endl; cout << "Tree Height:" << tree.Size() << endl;
//二叉树拷贝构造调用 BinaryTree<char> tree2 = tree; tree2.PreOrder();
cout << "PreOrder iteraotr!/n";
//二叉树前序迭代器 BinaryTree<char>::PreOrder_iterator preiter(tree2); while(!preiter.IsEnd()) {
cout << *preiter << ","; ++preiter; } cout << endl;
//二叉树中序迭代器 tree.InOrder(); cout << "InOrder iteraotr!/n"; BinaryTree<char>::InOrder_iterator initer(tree2); while(!initer.IsEnd()) {
cout << *initer << ","; ++initer; }
//二叉树后续迭代器 cout << endl; tree2.PostOrder(); cout << "PostOrder iteraotr!/n"; BinaryTree<char>::PostOrder_iterator postiter(tree2);
while(!postiter.IsEnd()) {
cout << *postiter << ","; ++postiter; }
return 0; } |
//文件BinaryTree.h
#ifndef BINARYTREE_H_ #define BINARYTREE_H_
#include "myStack.h"
#include <string> #include <iostream> #include <stdexcept>
enum ChildID { LEFTCHILD = 0, RIGHTCHILD }; //子节点类型,是左节点还是右节点
template <class Type> class BinaryTree;
//愚认为,如果BinTreeNode中的数据需要让大部分用户访问的话,应当是struct型 template <class Type> class BinTreeNode { friend class BinaryTree< Type >; public: BinTreeNode() : m_pParent(0), m_plChild(0), m_prChild(0){}
BinTreeNode( Type item, BinTreeNode<Type> *parent = 0, BinTreeNode<Type> *left = 0, BinTreeNode<Type> *right = 0 ) : m_pParent(parent), m_plChild(left), m_prChild(right), m_data(item) {}
Type GetData() const; //获取节点保存的数据 Type& GetDataRef(); //不应当提供这样的接口,这里仅仅让iterator能够自由访问存储的数据 BinTreeNode* GetParent() const; //获取节点的父节点 BinTreeNode* GetLeft() const; //获取节点的左子节点 BinTreeNode* GetRight() const; //获取节点的右子节点
void SetData( const Type& data ); //修改节点的数据
//下面是更改节点的指针域结构的function,是否真的需要,还得仔细考量 //做为树的节点,一般不允许直接访问节点中的指针数据,如果这些数据在树 //被建立完成以后修改,会破坏树的结构
void SetParent( BinTreeNode<Type>* parent, ChildID CHID ); //设置当前节点的父节点,并指定当前节点作为子节点的类型 void SetLeft( BinTreeNode<Type>* left); //设置当前节点的左子节点 void SetRight( BinTreeNode<Type>* right); //设置当前节点的右子节点
private: BinTreeNode< Type >* m_pParent; //父节点 BinTreeNode< Type >* m_plChild; //left Child BinTreeNode< Type >* m_prChild; //right Child Type m_data; }; //declare BinTreeNode end
//********************************************************* // BinTreeNode Implementation //********************************************************* template <class Type> Type BinTreeNode<Type>::GetData() const { return m_data; }
template <class Type> Type& BinTreeNode<Type>::GetDataRef() { return m_data; }
template <class Type> BinTreeNode<Type>* BinTreeNode<Type>::GetParent() const { return m_pParent; }
template <class Type> BinTreeNode<Type>* BinTreeNode<Type>::GetLeft() const { return m_plChild; }
template <class Type> BinTreeNode<Type>* BinTreeNode<Type>::GetRight() const { return m_prChild; }
template <class Type> void BinTreeNode<Type>::SetData( const Type& data ) { m_data = data; }
template <class Type> void BinTreeNode<Type>::SetParent( BinTreeNode<Type>* parent, ChildID CHID ) { if( !parent ) return;
if( CHID == m_plChild ) //当前节点作为parent的左子节点 { m_pParent = parent; parent->m_plChild = this; } else if( CHID == RIGHTCHILD ) //当前节点作为parent |
用C++实现二叉树
最新推荐文章于 2021-11-18 13:22:49 发布