#include<cstdio>
#include<cstdlib>
#include<queue>
using namespace std;
struct node{
int data;//数据域
int layer;//层序
node *lchild;//指向左子树结点的指针
node *rchild;//指向右子树结点的指针
};
node *root=NULL;
//生成一个新结点,v为结点权值
node *newNode(int v){
node *Node=new node;//申请一个node变量的地址空间
Node->data=v;//结点权值为v
Node->lchild=Node->rchild=NULL;//初始没有左右孩子
return Node; //返回新结点地址
}
//查找并修改
void search(node *root,int x,int newdata){
if(root=NULL){
return;//空树,死胡同(递归边界)
}
if(root->data==x){
root->data=newdata;//找到数据域为x的结点,把它修改成newdata
}
search(root->lchild,x,newdata);//往左子树搜索x(递归)
search(root->rchild,x,newdata);//往右子树
}
//insert函数将在二叉树中插入一个数据域为x的新结点
//注意根节点指针root要使用引用,否则插入不会成功
void insert(node *&root,int x){
if(root==NULL){//空树,说明查找失败,也即插入位置(递归边界)
root=newNode(x);
//root->lchild=NULL;
//root->rchild=NULL;
return;
}
if(/*由二叉树的性质,x应该插在左子树*/){
insert(root->lchild,x);
}else{
insert(root->rchild,x);
}
}
//二叉树的建立
node *Create(int data[],int n){
node *root=NULL;//新建空根root
for(int i=0;i<n;i++){
insert(root,data[i]);
}
return root;
}
//先序遍历
void preorder(node *root){
if(root==NULL){
return ;//到达空树,递归边界
}
//访问根节点root,例如将数据域输出
printf("%d\n",root->data);
//访问左子树
preorder(root->lchild);
preorder(root->rchild);
}
//中序遍历
void inorder(node *root){
if(root==NULL){
return;
}
inorder(root->lchild);
printf("%d\n",root->data);
inorder(root->rchild);
}
//后序遍历
void postorder(node *root){
if(root==NULL){
return;
}
postorder(root->lchild);
postorder(root->rchild);;
printf("%d\n",root->data);
}
//层序遍历
void LayerOrder(node *root){
queue<node *>q;//注意队列里存的是地址
q.push(root);//将根节点地址入队
root->layer=1;;
while(!q.empty()){
node *now=q.front();
q.pop();
printf("%d\n",now->data);
if(now->lchild!=NULL){
now->lchild->layer=now->layer+1;
q.push(now->lchild);//左子树非空
}
if(now->rchild!=NULL){
now->rchild->layer=now->layer+1;
q.push(now->rchild); //右子树非空
}
}
}
//根据前序和中序构建二叉树
//当前先序系列区间为[preL,preR],中序序列区间为[inL,inR],返回根节点地址
node *create(int preL,int preR,int inL,int inR){
if(preL>preR){
return NULL;//先序序列长度小于等于0,直接返回
}
node *root=new node;//新建一个新结点,用来存放当前二叉树根节点
root->data=pre[preL];//新结点的数据域为根节点的值
int k;
for(k=inL;k<=inR;k++){
if(in[k])==pre[preL];
break;//在中序序列中找到in[k]
}
int numLeft=k-inL;//左子树结点个数
//左子树的先序区间为[preL+1,preL+numLeft],中序区间为[inL,k-1]
//返回左子树的根节点地址,赋值给root的左指针
root->lchild=create(preL+1,preL+numLeft,inL,k-1);
//右子树的先序区间为[preL+numLeft+1,preR],中序区间为[k+1,inR]
//返回右子树的根节点地址,赋值给root右指针
root->rchild=create(preL+numLeft+1,preR,k+1,inR);
return root;//返回根节点地址
}
二叉树的一些基本操作
最新推荐文章于 2022-04-01 21:59:57 发布