二叉树的静态实现(前,中,后,层序遍历和查找修改值)

/**
二叉树的静态实现。
**/

#include
#include
#include
#include
using namespace std;
const int MAXN=1e4;//结点的最大个数 
struct Node{
	int data;//数据域 
	int l,r;//指针域 
}node[MAXN];
int index=0,data[MAXN];
int newNode(int x){//创建新节点 
	node[index].data=x;
	node[index].l=-1;
	node[index].r=-1;
	return index++;
}
void insert(int &root,int x){//加引用的目的是要改变root 
	if(root==-1){//空树
		root=newNode(x);//找到对应的位置,则插入进二叉树 
		return;
	}
	if(x<node[root].data)//这里以二叉搜索树为例,x比子树的跟小则放到左边,其他二叉树的性质,这里对应修改 
		insert(node[root].l,x);
	else
		insert(node[root].r,x);
}
int Create(int data[],int n){
	int root=-1;
	for(int i=0;i<n;i++)
		insert(root,data[i]);
	return root;//返回根节点(因为insert函数是递归操作,则每次返回的都是根节点) 
}
void search(int root,int x,int newdata){//修改新节点,也可实现查找新结点
	if(root==-1)	return;//空树 
	if(node[root].data==x){
		node[root].data=newdata;
		return;
	}
	search(node[root].l,x,newdata);
	search(node[root].r,x,newdata);
} 
void preorder(int root){//先序遍历:根左右 
	if(root==-1)
		return;
	printf("%d  ",node[root].data);
	preorder(node[root].l);
	preorder(node[root].r);
}
void inorder(int root){//中序遍历:左根右 
	if(root==-1)
		return ;
	inorder(node[root].l);
	printf("%d  ",node[root].data);
	inorder(node[root].r);
}
void postorder(int root){//后序遍历:左右根 
	if(root==-1)
		return;
	postorder(node[root].l);
	postorder(node[root].r);
	printf("%d  ",node[root].data);
}
void LayerOrder(int root){//层序遍历:借助队列,将队列里的结点删除,再将与删除结点(子的树根结点)相连的子结点全部入队列,循环操作直至队列为空 
	queue<int>q;
	q.push(root);
	while(!q.empty()){
		int now=q.front();
		q.pop();
		printf("%d  ",node[now].data);
		if(node[now].l!=-1)	q.push(node[now].l);
		if(node[now].r!=-1)	q.push(node[now].r);
	}
}
int main(){
	int n;;
	scanf("%d",&n);
	for(int i=0;i<n;i++)	scanf("%d",&data[i]);
	int root=Create(data,n);
	//先序遍历 
	preorder(root);
	puts("");
	//中序遍历 
	inorder(root);
	puts("");
	//后序遍历
	postorder(root);
	puts(""); 
	search(root,10,11);//将数据为10的改为11;
	//层序遍历 
	LayerOrder(root);
	puts(""); 
	
	return 0;
}
/*
10
7 4 9 2 6 8 10 1 3 5
*/

二叉树的静态实现(前,中,后,层序遍历和查找修改值)_第1张图片

你可能感兴趣的:(算法与数据结构)