二叉树的一些基本操作

#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;//返回根节点地址 
} 

发布了51 篇原创文章 · 获赞 7 · 访问量 7459

猜你喜欢

转载自blog.csdn.net/Jason6620/article/details/103987983
今日推荐