三叉链表实现-二叉树

二叉树节点:

#ifndef BINARYTREENODE_H
#define BINARYTREENODE_H
template <class T> class binaryTreeNode
{
 T data;
 binaryTreeNode<T> * leftChild;
 binaryTreeNode<T> * rightChild;
 binaryTreeNode<T> * parent;
public:
 binaryTreeNode(): data(-1),leftChild(NULL),rightChild(NULL),parent(NULL){}
 binaryTreeNode(const T value):data(value),leftChild(NULL),rightChild(NULL),parent(NULL){}
 ~binaryTreeNode(){cout<<"destroy:"<<getData()<<endl;}
 T & getData()
 {
  return data;
 }
 binaryTreeNode<T> * getLeftChild()
 {
  return leftChild;
 }
 binaryTreeNode<T> * getRightChild()
 {
  return rightChild;
 }
 binaryTreeNode<T> * getParent()
 {
  return parent;
 }
 void setData(T value)
 {
  data=value;
 }
 void setLeftChild(binaryTreeNode<T> * newLeftChild)
 {
  leftChild=newLeftChild;
 }
 void setRightChild(binaryTreeNode<T> * newRightChild)
 {
  rightChild=newRightChild;
 }
/* bool isLeftChild()
 {
   return this==parent->getLeftChild()?true:false;
 }
 bool isRightChild()
 {
  return this==parent->getRightChild()?true:false;
 } */
 bool isRoot()
 {
  return this-> getParent()==NULL?true:false;
 }

 void setParent(binaryTreeNode<T> * newParent)
 {
 // if(isRightChild())
 // {
   //parent->setLeftChild(NULL);
   parent=newParent;
 //  parent->setRightChild(this);
 // }
 // else{
     //parent->setRightChild(NULL);
 //  parent=newParent;
 //  parent->setLeftChild(this);
 // }
  

 }


};
#endif

 

二叉树的实现:

#ifndef BINARYTREE_H
#define BINARYTREE_H
#include"binaryTreeNode.h"
#include<queue>
template <class T> class binaryTree
{
 
 binaryTreeNode<T> * root;
public:
 binaryTree(): root(NULL){}
 binaryTree(const T value)
 {
  root=new binaryTreeNode<T>(value);
 }
 virtual ~binaryTree();
  bool isEmpty() const //判断树是否为空
 {
  return root ==NULL ?true:false;
 }
 bool isLeftChild(binaryTreeNode<T> * p)//判断当前节点是否为左孩子
 {
  return p==(getParent(p))->getLeftChild()?true:false;
 }
 bool isRightChild(binaryTreeNode<T> * p)//判断当前节点是否为右孩子
 {
  return p==(getParent(p))->getRightChild()?true:false;
 }
 binaryTreeNode<T> * getRoot()//返回根节点
 {
  return root;
 }
 binaryTreeNode<T> *leftChild(binaryTreeNode<T> *p)//返回当前节点的左孩子
 {
  return p==NULL?NULL:p->getLeftChild();
 }
 binaryTreeNode<T> *rightChild(binaryTreeNode<T> *p)//返回当前节点的右孩子
 {
  return p==NULL?NULL:p->getRightChild();
 }
 binaryTreeNode<T> *leftSibling(binaryTreeNode<T> *p)//返回当前节点的左兄弟
 {
  binaryTreeNode<T> * parent=p->getParent();
  return parent->getLeftChild();
 }

 binaryTreeNode<T> *rightSibling(binaryTreeNode<T> *p)//返回当前节点的右兄弟
 {
  binaryTreeNode<T> * parent=p->getParent();
     return p->getRightChild();
 }
 T retrieve(binaryTreeNode<T> *p) const //返回当前节点的数据
 {
  return p->getData();
 }
 void assign(binaryTreeNode<T> * p, const T value)//对当前节点数据进行重置
 {
  p->setData(value);
 } 
 void insertLeftChild(binaryTreeNode<T> * p, const T value);//在当前节点插入一个左孩子
 void insertLeftChild(binaryTreeNode<T> * p, binaryTreeNode<T> * leftChild);//重载在当前节点插如一个左孩子,该插入可以连接两棵树
 void insertRightChild(binaryTreeNode<T> * p, const T value);//在当前节点插入一个右孩子
 void insertRightChild(binaryTreeNode<T> * p, binaryTreeNode<T> * rightChild);//重载在当前节点插如一个右孩子,该插入可以连接两棵树
 void deleteRightChild(binaryTreeNode<T> *p)//删除右孩子
 {
  destroy(p->getRightChild());
 }
 void deleteLeftChild(binaryTreeNode<T> *p)//删除左孩子
 {
  destroy(p->getLeftChild());
 }
 virtual void preOrderTraverse(binaryTreeNode<T> *root) const ;//前序遍历
 virtual void inOrderTraverse(binaryTreeNode<T> *root) const ;//中序遍历
 virtual void postOrderTraverse(binaryTreeNode<T> *root) const ;//后序遍历
    virtual void leverOrderTraverse(binaryTreeNode<T> *root) const ;//层次遍历
protected:
 void destroy(binaryTreeNode<T> *);//删除以当前节点为根的树
};
template <class T> binaryTree<T>:: ~binaryTree()
{
 destroy(root);
 root=NULL;
}
/*template <class T> void binaryTree<T>::destroy(binaryTreeNode<T> *p) //用递归实现销毁树
{
 if(p!=NULL)
 {
  destroy(p->getLeftChild());
  destroy(p->getRightChild());
        delete p;
 }
}*/
template <class T> void binaryTree<T>::destroy(binaryTreeNode<T> *root)//用非递归实现销毁树
{

  queue< binaryTreeNode<T> * > q;
  if(NULL!=root)
   q.push(root);
 
  while(!q.empty())
  {
   root=q.front();
   q.pop();
   cout<<root->getData();
   if(root->getLeftChild())
    q.push(root->getLeftChild());
   if(root->getRightChild())
    q.push(root->getRightChild());
   delete root;
  }
       
 
}
template <class T> void binaryTree<T>:: insertLeftChild(binaryTreeNode<T> * p, const T value)
{
 binaryTreeNode<T> * add=new binaryTreeNode<T>(value);
 add->setLeftChild(p->getLeftChild());
 p->setLeftChild(add);
 add->setParent(p);

}
template <class T> void binaryTree<T>::  insertLeftChild(binaryTreeNode<T> * p, binaryTreeNode<T> * leftChild)
{
 p->setLeftChild(leftChild);
 leftChild->setParent(p);

}
template <class T> void binaryTree<T>:: insertRightChild(binaryTreeNode<T> * p, const T value)
{
 binaryTreeNode<T> * add=new binaryTreeNode<T>(value);
 add->setRightChild(p->getRightChild());
 p->setRightChild(add);
 add->setParent(p);

}
template <class T> void binaryTree<T>::  insertRightChild(binaryTreeNode<T> * p, binaryTreeNode<T> * rightChild)
{
 p->setRightChild(rightChild);
 rightChild->setParent(p);

}
template <class T> void binaryTree<T>::preOrderTraverse(binaryTreeNode<T> *root) const// 用递归实现
{
 if(root!=NULL)
 {
  cout<<root->getData();
  preOrderTraverse(root->getLeftChild());
  preOrderTraverse(root->getRightChild());

 }
}
template <class T> void binaryTree<T>::inOrderTraverse(binaryTreeNode<T> *root) const
{
 if(root!=NULL)
 {
  
  inOrderTraverse(root->getLeftChild());
  cout<<root->getData();
  inOrderTraverse(root->getRightChild());
 }
}
template <class T> void binaryTree<T>:: postOrderTraverse(binaryTreeNode<T> *root) const
{
 if(root!=NULL)
 {
  
  postOrderTraverse(root->getLeftChild());
  postOrderTraverse(root->getRightChild());
  cout<<root->getData();
 }
}
 template <class T> void binaryTree<T>:: leverOrderTraverse(binaryTreeNode<T> *root) const
{
  queue< binaryTreeNode<T> * > q;
  if(NULL!=root)
   q.push(root);
 
  while(!q.empty())
  {
   root=q.front();
   q.pop();
   cout<<root->getData();
   if(root->getLeftChild())
    q.push(root->getLeftChild());
   if(root->getRightChild())
    q.push(root->getRightChild());
  }
}
#endif

测试:

#include<iostream>
#include"binaryTreeNode.h"
#include"binaryTree.h"
using namespace std;
void main()
{
 binaryTreeNode<int> *t2=new binaryTreeNode<int>(5),*t1,*t3;
 //t4=&t2;
 cout<<t2->getData()<<endl;
 cout<<t2->getLeftChild()<<endl;
 cout<<t2->getRightChild()<<endl;
 cout<<t2->getParent()<<endl;
     binaryTree<int> tree1(1);
 t1=tree1.getRoot();
 tree1.insertLeftChild(t1,2);
 tree1.insertRightChild(t1,3);


 tree1.insertLeftChild(t2,t1);

 tree1.preOrderTraverse(t2);
// tree2.leverOrderTraverse(t3);
 //tree.deleteLeftChild(t1);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数据结构源码C语言描述续,本篇描述了二叉树三叉链表结构及其操作,以及测试程序: //创建二叉树结点 TriTreeNode *CreateTriTreeNode(char data); //给二叉树添加结点,用于创建二叉树 int AddTriTreeNode(char data, TriTreeNode *newTriNode); //创建二叉树 TriTreeNode *CreateTriTree(); //计算二叉树的高度 int GetTriTreeDepth(TriTreeNode *triTree); //插入结点(连接两棵二叉树),这个结点(二叉树)和root不相交; //newTriNode可以是一个结点也可以是一棵二叉树 int InsertChildTriNode(TriTreeNode *newTriNode, TriTreeNode *root); //获取根结点 TriTreeNode *GetTriTreeRoot(TriTreeNode *triTree); //判断二叉树是否为空 int IsTriTreeEmpty(TriTreeNode *triTree); //获取二叉树中某一个结点的左孩子结点 void GetLeftChildFromTriTree(TriTreeNode *triTree, TriTreeNode *triNode, TriTreeNode *lChild); //获取二叉树中某一个结点的右孩子结点 void GetRightChildFromTriTree(TriTreeNode *triTree, TriTreeNode *triNode, TriTreeNode *rChild); //获取二叉树某一个指定结点父节点 int GetTriTreeParent(TriTreeNode *root, TriTreeNode *triNode, TriTreeNode *parentNode); //删除二叉树,某一个指定结点的左或右子树 void DeleteChildFromTriTree(TriTreeNode *root, TriTreeNode *triNode, int flag); //销毁二叉树 void DestroyTriTree(TriTreeNode *TriTree); //先序遍历(DRL), 先序遍历按照既定算法遍历出来将是一个无序列表 void PreOrderTraversTriTreeDRL(TriTreeNode *TriTree); //先序遍历(DLR), 先序遍历按照既定算法遍历出来将是一个无序列表 void PreOrderTraversTriTreeDLR(TriTreeNode *TriTree); //中序遍历(LDR),遍历结果应该是一个从小到大的有序排列 void InOrderTraversTriTreeLDR(TriTreeNode *TriTree); //中序遍历(RDL),遍历结果是一个从大到小的有序排列 void InOrderTraversTriTreeRDL(TriTreeNode *triTree); //后续遍历(LRD) void PostOrderTraversTriTreeLRD(TriTreeNode *TriTree); //后续遍历(RLD), void PostOrderTraversTriTreeRLD(TriTreeNode *TriTree);

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值