二叉树的创建及基本操作。
来源:互联网 发布:壁虎数据激活码 编辑:程序博客网 时间:2024/05/16 19:20
#include<iostream>
#include<vector>
using namespace std;
typedef struct node
{
int data;
struct node *lchild;
struct node *rchild;
}binode,*bitree;
bitree initree(binode *root)//创建二叉树
{
bitree tree=root;
return tree;
}
binode *makenode(int item,binode *lchild,binode *rchild)//增加节点
{
binode *pnode;
pnode=(binode *)malloc(sizeof(binode));
if(pnode)
{
pnode->data=item;
pnode->lchild=lchild;
pnode->rchild=rchild;
}
return pnode;
}
void midorder(bitree tree,void (*visit)(int item))//中序遍历
{
binode *pnode=tree;
if(pnode)
{
midorder(pnode->lchild,visit);
visit(pnode->data);
midorder(pnode->rchild,visit);
}
}
void lineorder(bitree tree)//层序遍历
{
binode *pnode=tree;
vector<binode *>vec;
if(tree==NULL)
return;
else
vec.push_back(pnode);
int cd=0,rd=1;
while(cd<vec.size())
{
rd=vec.size();
while(cd<rd)
{
cout<<vec[cd]->data<<endl;
if(vec[cd]->lchild != NULL)
vec.push_back(vec[cd]->lchild);
if(vec[cd]->rchild != NULL)
vec.push_back(vec[cd]->rchild);
++cd;
}
}
}
void print(int item)
{
cout<<item<<endl;
}
binode *insert(bitree tree,int k)//二叉排序树插入节点
{
binode *pnode;
pnode=tree;
if(pnode==NULL)
{
pnode=(binode *)malloc(sizeof(binode));
pnode->data=k;
pnode->lchild=NULL;
pnode->rchild=NULL;
return pnode;
}
else if(k==pnode->data)
return pnode;
else if(k<pnode->data)
{
pnode->lchild=insert(pnode->lchild,k);
return pnode;
}
else
{
pnode->rchild=insert(pnode->rchild,k);
return pnode;
}
}
bitree del(bitree tree,int k)//二叉排序树删除节点
{
if(tree==NULL)
{
cout<<"树为空"<<endl;
return NULL;
}
binode *pnode=tree,*pre;
while(pnode->data!=k&&pnode!=NULL)
{
pre=pnode;
if(k<pnode->data)
pnode=pnode->lchild;
else
pnode=pnode->rchild;
}
if(pnode==NULL)
{
cout<<"未找到"<<endl;
return tree;
}
if(pnode->lchild==NULL&&pnode->rchild==NULL)
{
if(pre==NULL)
{
free(pnode);
return NULL;
}
else if(pnode->data<pre->data)
{
pre->lchild=NULL;
free(pnode);
return tree;
}
else
{
pre->rchild=NULL;
free(pnode);
return tree;
}
}
else if(pnode->lchild==NULL&&pnode->rchild!=NULL)
{
if(pre==NULL)
{
tree=pnode->rchild;
free(pnode);
return tree;
}
else if(pnode->data<pre->data)
{
pre->lchild=pnode->rchild;
free(pnode);
return tree;
}
else
{
pre->rchild=pnode->rchild;
free(pnode);
return tree;
}
}
else if(pnode->lchild!=NULL&&pnode->rchild==NULL)
{
if(pre==NULL)
{
tree=pnode->lchild;
free(pnode);
return tree;
}
else if(pnode->data<pre->data)
{
pre->lchild=pnode->lchild;
free(pnode);
return tree;
}
else
{
pre->rchild=pnode->lchild;
free(pnode);
return tree;
}
}
else //if(pnode->lchild!=NULL&&pnode->rchild!=NULL)
{
binode *p;
p=pnode->rchild;
if(pre==NULL)
{
while(p->lchild!=NULL)
p=p->lchild;
int temp;
temp=p->data;
del(pnode,p->data);
pnode->data=temp;
return tree;
}
else
{
while(p->lchild!=NULL)
p=p->lchild;
int temp=p->data;
del(pnode,p->data);
pnode->data=temp;
return tree;
}
}
}
void search(bitree tree,int k)//二叉树查找
{
binode * pnode;
pnode=tree;
if(pnode==NULL)
cout<<"不成功";
else if(tree->data==k)
cout<<"查找成功";
else if(k<tree->data)
{
search(tree->lchild,k);
}
else
{
search(tree->rchild,k);
}
}
int main()
{
binode * n1 = makenode(2,NULL,NULL);
binode * n2 = makenode(1,NULL,n1);
binode * n3 = makenode(5,NULL,NULL);
binode * n4 = makenode(7,NULL,NULL);
binode * n5 = makenode(3,n2,NULL);
binode * n6 = makenode(6,n3,n4);
binode * n7 = makenode(4,n5,n6);
bitree tree=initree(n7);
tree=del(tree,4);
lineorder(tree);
return 0;
}
0 0
- 二叉树的创建及基本操作。
- 二叉树的创建及一些基本操作
- 二叉树的基本操作及遍历
- 二叉树的定义及基本操作
- 二叉树的创建,及遍历 操作
- 二叉树的创建及简单操作
- 数据结构(十二) 二叉树的基本操作 --- 创建一个二叉树 前中后序遍历二叉树
- 二叉树的基本操作及四种排序
- 二叉树的基本操作及应用(三)
- 平衡二叉树(AVL)的介绍及基本操作
- 【数据结构】二叉树的简单遍历及基本操作
- 二叉树的链式存储结构及基本操作
- 二叉树的基本操作及部分面试题
- 二叉树的基本操作及部分面试题
- 二叉树创建及基本遍历方式
- 二叉查找树的创建及删除节点操作
- 二叉树的创建及各种遍历操作
- 二叉树基本操作及二叉排序树
- 几乎包括了UISegmentedControl的所有属性和方法
- 与《新走遍美国》的邂逅
- 脏读、幻读、不可重复读 and 乐观锁、悲观锁 and 事务五种隔离级别
- Android的Proxy/Delegate Application框架
- gh0st 内核代码分析
- 二叉树的创建及基本操作。
- 二分图的最大匹配的匈牙利算法
- 海量数据处理
- Android 开发笔记-Eclipse中文乱码
- LeetCode_Combination Sum
- Group by all | with cube | with rollup 的用法
- 我与C++设计模式(十八)——命令模式
- Frege 一种新的基于jvm的纯函数式编程语言
- unix\linux编程学习笔记之终端模式