二叉树的C++实现

 

/*--------BTree.h---------*/

#ifndef _BTREE_H_
#define _BTREE_H_

 

#include <iostream>
using namespace std;

 

//树节点的结构

typedef class bTree
{
public:
 int data;
 bTree *lchild,*rchild;
}bTreeNode,*pbTreeNode;

 

class BTree
{
public:
 pbTreeNode root;

 BTree();
 ~BTree();

 void Create_BTree(int);   //建立二叉树
 void Preorder(pbTreeNode);  //前序遍历
 void Inorder(pbTreeNode);  //中序遍历
 void Postorder(pbTreeNode);  //后序遍历

 

 int count(pbTreeNode);  //计算二叉树结点的个数
 int LeafNum(pbTreeNode); //计算二叉树叶子的个数
 int NodeNum(pbTreeNode); //计算二叉树度数为1时的结点个数

private:
 static int node_num,leaf_num;
};

 

#endif

 

 

/*-------------BTree.cpp------------*/

 

#include "BTree.h"

int BTree::node_num=0;
int BTree::leaf_num=0;

 

BTree::BTree()
{
 root=NULL;
}

BTree::~BTree()
{
 delete root;
}

 

//建立二叉树
void BTree::Create_BTree(int value)
{
 pbTreeNode newNode=new bTreeNode;
 if(NULL==newNode)
 {
  cout<<"Memory allocate failed!\n";
  exit(-1);
 }

 newNode->data=value;
 newNode->rchild=newNode->lchild=NULL;

 if(NULL==root)
 {
  root=newNode;
 }

 

 else
 {
  pbTreeNode current=root,back=NULL;
  while(NULL!=current)
  {
   back=current;
   if((current->data)>value)
    current=current->lchild;
   else
    current=current->rchild;
  }

  if((back->data)>value)
   back->lchild=newNode;
  else
   back->rchild=newNode;
 }
}

 

//计算二叉树结点的个数
int BTree::count(pbTreeNode Pointer)
{
 if(NULL==Pointer)
  return 0;
 else
  return (count(Pointer->lchild)+count(Pointer->rchild)+1);
}

 

//计算二叉树叶子的个数
int BTree::LeafNum(pbTreeNode Pointer)
{
 if(NULL==Pointer)
  return 0;

 else
 {
  if(NULL==Pointer->lchild && NULL==Pointer->rchild)
   return leaf_num++;
  else
  {
   LeafNum(Pointer->lchild);
   LeafNum(Pointer->rchild);
  }
  return leaf_num;
 }
}

 

//计算二叉树度数为1时的结点个数
//结点所拥有的子树的个数称为结点的度
int BTree::NodeNum(pbTreeNode Pointer)
{
 if(NULL==Pointer)
  return 0;

 else
 {
  if(NULL!=Pointer->lchild && NULL!=Pointer->rchild)
  {
   NodeNum(Pointer->lchild);
   NodeNum(Pointer->rchild);
  }
  if(NULL!=Pointer->lchild && NULL==Pointer->rchild)
  {
   node_num++;
   NodeNum(Pointer->lchild);
  }
  if(NULL==Pointer->lchild && NULL!=Pointer->rchild)
  {
   node_num++;
   NodeNum(Pointer->rchild);
  }
 }
 return node_num;
}

 

//前序遍历
void BTree::Preorder(pbTreeNode Pointer)
{
 if(NULL!=Pointer)
 {
  cout<<" ["<<Pointer->data<<"] ";
  Preorder(Pointer->lchild);
  Preorder(Pointer->rchild);
 }
}

 

//中序遍历
void BTree::Inorder(pbTreeNode Pointer)
{
 if(NULL!=Pointer)
 {
  Inorder(Pointer->lchild);
  cout<<" ["<<Pointer->data<<"] ";
  Inorder(Pointer->rchild);
 }
}

 

//后序遍历
void BTree::Postorder(pbTreeNode Pointer)
{
 if(NULL!=Pointer)
 {
  Postorder(Pointer->lchild);
  Postorder(Pointer->rchild);
  cout<<" ["<<Pointer->data<<"] ";
 }
}

 

 

/*************main.cpp*************/

 

#include "BTree.h"

int main()
{
 int arr[]={7,4,1,5,16,8,11,12,15,9,2};
 int len=sizeof(arr)/sizeof(arr[0]);
 BTree btree;

 

 cout<<"原数组元素为:\n";
 for(int i=0;i<len;++i)
 {
  cout<<" "<<arr[i];
  btree.Create_BTree(arr[i]);
 }

 

 cout<<"\n\n";
 cout<<"二叉树节点个数:"<<btree.count(btree.root)<<endl;

 cout<<"\n二叉树叶子个数:"<<btree.LeafNum(btree.root)<<endl;

 cout<<"\n二叉树度数为1的节点个数:"<<btree.NodeNum(btree.root)<<endl;

 

 cout<<"\n先序遍历:\n";
 btree.Preorder(btree.root);

 cout<<"\n\n中序遍历:\n";
 btree.Inorder(btree.root);

 cout<<"\n\n后序遍历:\n";
 btree.Postorder(btree.root);

 

 cout<<"\n\n";
 return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值