编程关于树的问题

2025-12-25 07:34:10
推荐回答(5个)
回答1:

这个是c++程序,呵呵
显示的是后续遍历
#include
typedef struct TreeNode
{
int key;
struct TreeNode *left;
struct TreeNode *right;

}treeNode;

class BiSortTree
{
public:
BiSortTree(void);
void desplayTree(void);//显示这个树
void insertTree(int key);//在树中插入一个值
deleteTree(int key);//在树中删除一个值
treeNode* searchTree(int key);//在树中查找一个值

~BiSortTree();

private:
treeNode* buildTree(treeNode* head,int number);//建立一个树
treeNode* search(treeNode* head ,int key);//查找
treeNode* BiSortTree::searchParent(treeNode* head,treeNode* p);//查找出p的父亲节点的指针
treeNode* BiSortTree::searchMinRight(treeNode* head);//找到右子树中最小的节点

void showTree(treeNode* head);//显示
void destroyTree(treeNode* head);//删除

treeNode *Head;

};

/**************以下是建立一个二叉排序树****************/
BiSortTree::BiSortTree()
{
cout<<"建立一棵二叉排序树,请输入你要建树的所有数(以-1 作为结束标志!): "< Head=NULL;
int number;
cin>>number;
while(number!=-1)
{
Head=buildTree(Head,number);
cin>>number;

}

}
treeNode* BiSortTree::buildTree(treeNode* head,int number)
{

treeNode *p;
p=new treeNode;
p->key=number;
p->left =p->right=NULL;

if(head==NULL)
{

return p;
}
else
{

if(p->key key)
head->left=buildTree(head->left,number);
else
head->right=buildTree(head->right,number);

return head;
}

}
/*****************以下是在一棵二叉排序树插入一个数***********************************/
void BiSortTree::insertTree(int key)
{

Head=buildTree(Head,key);

}
/*****************以下是在一个二叉排序树查找一个数是否存在*************************/
treeNode* BiSortTree::searchTree(int key)
{
return search(Head,key);
}
treeNode* BiSortTree::search(treeNode* head ,int key)
{
if(head==NULL)
return NULL;
if(head->key==key)
return head;
else
{
if(keykey )
return search( head->left,key);

else
return search(head->right,key);

}

}

/************以下是在一个二叉排序树删除一个给定的值*********************************/
BiSortTree::deleteTree(int key)
{

treeNode *p;
p=NULL;
p=search(Head,key);
if(p==NULL)
{
cout<<"Don't find the key";

}
if(p==Head)
{
Head=NULL;

}
else
{
treeNode* parent;
parent=searchParent(Head,p);
if(p->left==NULL&&p->right==NULL)//叶子节点
{
if(parent->left==p)
{
parent->left=NULL;
}
else
{
parent->right=NULL;

}
}
else//非叶子节点
{
if(p->right==NULL)//该节点没有右孩子
{
if(parent->left==p)
{
parent->left=p->left ;
}
else
{
parent->right=p->left;

}
}

else//该点有左右孩子
{
treeNode * rightMinSon,* secondParent;//secondParent为右子树中的最小节点的父亲
rightMinSon=searchMinRight(p->right);
secondParent=searchParent(p->right ,rightMinSon);

secondParent->left=rightMinSon->right;

if(p->right==rightMinSon)//右子树中的最小节点的父亲为p
{

p->right=rightMinSon->right ;

}

p->key=rightMinSon->key ;

}
}
}
}

treeNode* BiSortTree::searchParent(treeNode* head,treeNode* p)
{

if(head->left==p||head->right==p||head==p||head==NULL)
return head;
else
{
if(p->keykey)
return searchParent(head->left ,p);
else
return searchParent(head->right ,p);

}

}

treeNode* BiSortTree::searchMinRight(treeNode* head)//找到右子树中最小的节点
{

if(head->left ==NULL||head==NULL)
{
return head;

}
else
{
return searchMinRight(head->left);

}

}

/*****************以下是显示一个二叉排序树****************************************/
void BiSortTree::desplayTree(void)
{

showTree(Head);
cout<}
void BiSortTree::showTree(treeNode* Head)
{

if(Head!=NULL)
{
showTree(Head->left ) ;

cout<key<<' ' ;

showTree(Head->right) ;

}

}

/*****************以下是删除一棵整二叉排序树************************************/
BiSortTree::~BiSortTree()
{
cout<<"已经消除了一棵树!!!!"<destroyTree(Head);
}
void BiSortTree::destroyTree(treeNode* head )
{

if(head!=NULL)
{
destroyTree(head->left );
destroyTree(head->right );
delete head;

}

}

/*********************/
void print()
{

cout<<<"1.显示树的中序遍历"< <<"2.插入一个节点"<<<"3.寻找一个节点"<<<"4.删除一个节点"<}

void main()
{
BiSortTree tree;
int number;
int choiceNumber;
char flag;
while(1)
{
print() ;

cout<<"请选择你要进行的操作(1~4)"< cin>>choiceNumber;
switch(choiceNumber)
{
case 1:
tree.desplayTree();break;
case 2:
cout<<"请插入一个数: "< cin>>number;
tree.insertTree(number);
tree.desplayTree();
break;

case 3:
cout<<"请插入你要找数: "< cin>>number;
if(tree.searchTree(number)==NULL)
{
cout<<"没有发现"< }
else
{

cout<<"发现"<
}
break;

case 4:
cout<<"请输入你要删除的数: "< cin>>number;
tree.deleteTree(number);
tree.desplayTree();
break;

default: break;
}
cout<<"你是否要继续(Y/N)?"< cin>>flag;
if(flag=='N'||flag=='n')
break;

}

}

回答2:

题目的意思是第一行输出二叉树跟节点,第二行从左到右打印第二层的数吗?
#include
#include
struct node{//节点

double x;
node *l,*r;
node(double a=0,node *L=0,node *R=0){ x=a;l=L;r=R;}
};
class BT //树的定义
{
public:
node *root;
BT(node *a=0)
{
root=a;
}
void insert(double );//插入
void print(){queue s;//按广度遍历输出
node *tmp=root;
s.push(tmp);
while(s.empty()==false)
{
tmp=s.front();
cout<x<<'\t';
s.pop();
if(tmp->l!=0) s.push(tmp->l);
if(tmp->r!=0) s.push(tmp->r);
}

}
void destroy()//销毁树
{
queue s;
node *tmp=root;
s.push(tmp);
while(s.empty()==false)
{
tmp=s.front();
s.pop();
if(tmp->l!=0) s.push(tmp->l);
if(tmp->r!=0) s.push(tmp->r);
delete tmp;
}
}
};
void BT::insert(double a)
{
node *tmp,*pre=root,*now=root;
tmp=new node;
tmp->x=a;
tmp->l=tmp->r=0;
if(root==0) root=tmp;
else{
while(now)
{
pre=now;
if(now->xx) now=now->l;
else now=now->r;
}
if(pre->x>tmp->x) pre->r=tmp;
else pre->l=tmp;
}
}

void main()
{
double a[]={49,2,19,25,36,5,72,60,41,52,28,10,44,37,14,32,8,76,81};
BT bt;
for(int i=0;i<19;i++)
bt.insert(a[i]);
bt.print();
cout< bt.destroy();
cout<<"已经释放树占用内存"<}

回答3:

这是建立一棵二叉搜索树,至于代码,我空间上有,你可以自己去看
http://hi.baidu.com/%C4%C7%C6%AE%C3%EC%B5%C4%B8%D0%BE%F5/blog/item/fa7901ec1e8b9c392df534b1.html上面还有你可能用到的其它函数

回答4:

后序遍历算法 可以 具体代码 数据结构书上面有~

回答5:

进来看看