按照树的结构遍历输出:

递归删除子节点

数组表示二叉树:
Tree.h:
#ifndef INC_0210_TREE_H
#define INC_0210_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 //INC_0210_TREE_HTree.cpp:
#include "Tree.h"
#include <iostream>
using namespace std;
Tree::Tree(int size,int *pRoot) {
m_iSize = size;
m_pTree = new int[size];
//初始化为0
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){
//对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;
}
//若合法,0-左,1-右
if(direction == 0){
if( nodeIndex * 2 + 1 >= m_iSize){
return false;
}
//若当前结点没有意义
if(m_pTree[nodeIndex * 2 + 1] != 0){//若左节点已经有值
return false;
}
m_pTree[nodeIndex * 2 + 1] = *pNode;//pNode本身是一个指针,我们需要往里面放内容
}
if(direction == 1){
if( nodeIndex * 2 + 2 >= m_iSize){
return false;
}
//若当前结点没有意义
if(m_pTree[nodeIndex * 2 + 2] != 0){//若左节点已经有值
return false;
}
m_pTree[nodeIndex * 2 + 2] = *pNode;//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]<<" ";
}
}main.cpp:
#include <iostream>
#include "Tree.h"
#include <stdlib.h>
using namespace std;
/*
二叉树(数组表示,也可以使用链表表达)
课程要求:完成树的基本操作
1.树的创建和销毁
2.树中节点的搜索
3.树中节点的添加与删除
4.树中节点的遍历
BOOL CreatTree(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
3(0) 父结点下标*2+1 该结点左
父结点下标*2+2 该结点右
5(1) 8(2)
2(3) 6(4) 9(5)7(6)
*/
int main() {
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);
int node = 0;
pTree->DeleteNode(6,&node);
cout <<endl <<"node="<<node<< endl;
pTree->TreeTraverse();
int *p = pTree->SearchNode(2);
cout <<endl <<"node="<< *p << endl;
delete pTree;//调用析构函数
return 0;
}
C语言代码 , 自己去调一下格式 美化地址http://web.chacuo.net/formatc
#include<stdio.h>#define Max 1000typedef struct tr{ int node[Max]; int size;}tree;bool CreatTree(int size,tree *t){ if(size<=0||size>Max) return false; t->size=size; for(int i=0;i<size;i++) scanf("%d",&t->node[i]); return true;}void Destroy(tree *t){ ;}int *SearchNode(int nodeIndex,tree *t){ if(nodeIndex<0||nodeIndex>=t->size) return NULL; if(t->node[nodeIndex]==0) return NULL; return &t->node[nodeIndex];}bool AddNode(int nodeIndex,int derection,int node,tree *t){ if(nodeIndex<0||nodeIndex>=t->size) return false;/* if(t->node[nodeIndex]!=0) return false;*/ if(nodeIndex*2+derection>=t->size) return false; t->node[nodeIndex*2+derection]=node; return true;}bool DeleteNode(int nodeIndex,tree *t){ if(nodeIndex<0||nodeIndex>=t->size) return false; if(t->node[nodeIndex]==0) return false; t->node[nodeIndex]=0; return true; }void TreeTraverse(tree *t){ for(int i=0;i<t->size;i++) { printf("%d ",t->node[i]); } printf("\n");}int main(){ //数组下标从0开始使用,所以存在物理位置和逻辑位置的转换 tree t; int size; scanf("%d",&size); CreatTree(size,&t); int nodeIndex; scanf("%d",&nodeIndex);//操作结点 int *p=SearchNode(--nodeIndex,&t); printf("查找结果:%d\n",*p); int node; int derection; scanf("%d %d %d",&nodeIndex,&derection,&node); AddNode(--nodeIndex,derection,node,&t);//插入nodeIndex的左儿子(derection==1)结点或者右儿子(derection==2)结点 TreeTraverse(&t); scanf("%d",&nodeIndex); DeleteNode(--nodeIndex,&t); TreeTraverse(&t); return 0;}