用C++实现二叉树

本文详细介绍了如何使用C++编程语言实现二叉树的数据结构。内容涵盖二叉树节点的定义、插入、删除、遍历等操作,同时讨论了迭代器的使用以及空指针处理。通过实例代码解析,帮助读者深入理解C++中二叉树的构建和操作。
摘要由CSDN通过智能技术生成

C++ 基础内容, 不值一提

AuthorJacky Wu       2006-5-15

引用该文章,必须注明其出处              http://blog.csdn.net/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

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值