初学编程C++之树(二叉树——数组)

代码示例:

#ifndef TREE_H
#define TREE_H

class Tree
{
public:
	Tree(int size,int*pRoot);//创建树
	~Tree();//销毁树
	int *SearchNode(int nodeIndex);//根据索引寻找结点
	bool AddNode(int nodeIndex,int direction,int*pNode);//添加结点
	bool DeleteNode(int nodeIndex,int*pNode);//删除结点
	void TreeTraverse();//遍历节点结点
private:
	int*m_pTree;
	int m_iSize;
};
#endif

#include"Tree.h"
#include<iostream>
using namespace std;
Tree::Tree(int size ,int*pRoot)
{
	m_iSize=size;
	m_pTree=new int[size];
	for(int i=0;i<size;i++)
	{
		m_pTree[i]=0;
	}
	m_pTree[0]=*pRoot;
}
Tree::~Tree()
{
	delete[]m_pTree;
	m_pTree=NULL;
}
int *Tree::SearchNode(int nodeIndex)
{
	if(nodeIndex<0 || nodeIndex>=m_iSize)
	{
		return NULL;
	}
	
	if(m_pTree[nodeIndex]==0)
	{
		return NULL;
	}
	return &m_pTree[nodeIndex];
}
bool Tree::AddNode(int nodeIndex,int direction,int*pNode)
{
	if(nodeIndex<0 || nodeIndex>=m_iSize)
	{
		return false;
	}
	
	if(m_pTree[nodeIndex]==0)
	{
		return false;
	}
	if(direction==0)
	{
		if(nodeIndex*2+1<0 || nodeIndex*2+1>=m_iSize)
	    {
		    return false;
	    }
	
	    if(m_pTree[nodeIndex]==0)
	    {
		    return false;
	    }
		m_pTree[nodeIndex*2+1]=*pNode;
	}
	if(direction==1)
	{
		if(nodeIndex*2+2<0 || nodeIndex*2+2>=m_iSize)
	    {
		    return false;
	    }
	
	    if(m_pTree[nodeIndex]==0)
	    {
		    return false;
	    }
		m_pTree[nodeIndex*2+2]=*pNode;
	}
	return true;
}
bool Tree::DeleteNode(int nodeIndex,int*pNode)
{
	
	if(nodeIndex<0 || nodeIndex>=m_iSize)
	{
		return false;
	}
	
	if(m_pTree[nodeIndex]==0)
	{
		return false;
	}
	*pNode=m_pTree[nodeIndex];
	m_pTree[nodeIndex]=0;
	return true;
}
void Tree::TreeTraverse()
{
	for(int i=0;i<m_iSize;i++)
	{
		cout<<m_pTree[i]<<",";
	}
}


/*
  二叉树(数组表示)

  课程要求:完成树的基本操作
      1、树的创建与销毁
	  2、树中结点的搜索
	  3、树中结点的添加与删除
	  4、树中结点的遍历
	  BOOL CreateTree(Tree**pTree,Node*pRoot);//创建树
	  void DestroyTree(Tree*pTree);//销毁树
	  Node*SearchNode(Tree*pTree,int nodeIndex);//根据索引寻找结点
	  BOOL AddNode(Tree*pTree,int nodeIndex,int direction,Node*pNode);//添加结点
	  BOOL DeleteNode(Tree*pTree,int nodeIndex,Node*pNode);//删除结点
	  void TreeTraverse(Tree*pTree);//遍历

	  关于数组与树之间的算法转换
       
	   int Tree[n] 3   5 8   2 6 9 7 父亲节点下标*2+1 该结点左
	                                 父亲节点下标*2+2 该结点右

              3(0)

		5(1)        8(2)

    2(3)   6(4)  9(5)   7(6)
  */
#include<iostream>
#include<stdlib.h>
#include"Tree.h"
using namespace std;
int main(void)
{
	int root=3;
	Tree *pTree= new Tree(10,&root);
	int node1=5;
	int node2=8;
	pTree->AddNode(0,0,&node1);
	pTree->AddNode(0,1,&node2);

	int node3=2;
	int node4=6;
	pTree->AddNode(1,0,&node3);
	pTree->AddNode(1,1,&node4);

	int node5=9;
	int node6=7;
	pTree->AddNode(2,0,&node5);
	pTree->AddNode(2,1,&node6);

	pTree->TreeTraverse();

	int *p=pTree->SearchNode(2);
	cout<<endl<<"node="<<*p<<endl;

	int temp=0;
	pTree->DeleteNode(6,&temp);
	cout<<"delete ="<<temp<<endl;
	pTree->TreeTraverse();

	delete pTree;
	pTree=NULL;
	system("pause");
	return 0;
}

打印结果:
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值