数据结构——二叉树的数组实现

实现算法:二叉树从上到下,从左往右进行编号,然后放入数组中。
ps:对二叉树进行操作时,对下标和该节点是否有值要进行判断
在这里插入图片描述

  • main文件
#include <iostream>
#include "Tree.h"
using namespace std;

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char** argv) {
	int root = 3;
	Tree *pTree = new Tree(10,&root);

	int node1 = 5;
	int node2 = 8;
	pTree->AddNode(0,1,&node1);
	pTree->AddNode(0,0,&node2);

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

	int node5 = 9;
	int node6 = 7;
	pTree->AddNode(2,1,&node5);
	pTree->AddNode(2,0,&node6);
	
	pTree->TreeTraverse();
	
	int *p = pTree->SearchNode(4);//Search返回的是一个指针,用指针接收 
	cout << endl << "node = " << *p <<endl; 
	
	int temp = 0;
	pTree->DeleteNode(3,&temp); 
	cout << "deleted number:" << temp << endl;

	pTree->TreeTraverse();
	delete pTree;
	pTree = NULL;	
	return 0;
}
  • Tree文件
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();//遍历节点 
		
	protected:
		int *m_pTree;
		int m_iSize;
};

#include <iostream>
#include "Tree.h"
using namespace std;

Tree :: Tree(int size,int *pRoot){
	m_iSize = size;
	m_pTree = new int[size];
	for( int i = 0;i < m_iSize;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 == 1 ){
	 	if( 2*nodeIndex +1 >= m_iSize )
	 		return false;
	 	if( m_pTree[nodeIndex*2 +1] != 0 )
	 		return false;
	 	m_pTree[2*nodeIndex + 1] = *pNode;
	 }
	if(direction == 0 ){
		if( 2*nodeIndex +2 >= m_iSize )
	 		return false;
	 	if( m_pTree[nodeIndex*2 + 2] != 0 )
	 		return false;
		m_pTree[2*nodeIndex + 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] << " ";
	}
}

演示结果:在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

玖玖玖_violet

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值