树的基本操作,静态法

树的基本操作

1.定义

lchid和rchild存放的是在tree的序号,不是data值

struct node{
	int data;
	int lchild;
	int rchild;
}tree[MAX];

2.新建节点

-1表示没有该节点,代替NULL

int index=0;
int newNode(){
    tree[index].lchid=-1;
    tree[index].rchid=-1;
    return index++;
}

3.查找某节点,并修改其值

//root为根节点的下标
void search(int root,int x,int newdata){
	if(root==-1){
		return;
	}
	if(tree[root].data==x){
		tree[root].data=newdata;
	}
	search(tree[root].lchild,x,newdata);
	search(tree[root].rchild,x,newdata);
}

4.插入和建立

//root为根节点的下标
void insert(int root,int x){
	if(root==-1){
		root=newNode();
		tree[root].data=x;
		return;
	}
	if(插在左子树的性质){
		insert(tree[root].lchild,x)
	}else{
		insert(tree[root].rchild,x);
	}
}

//建立二叉树,其值存在a[]中
int create(int n,int a[]){
    int root=newNode();
    tree[root].data=a[0];
    for(int i=1;i<n;i++){
        insert(root,data[i]);
    }
    return root;
}

5.遍历

//先序
void pre(int root){
	if(root==-1){
		return;
	}
	//访问该节点
	visit(tree[root].data);
	pre(tree[root].lchild);
	pre(tree[root].rchild);
}
//中序
void in(int root){
	if(root==-1){
		return;
	}
	in(tree[root].lchild);
	//访问该节点
	visit(tree[root].data);
	in(tree[root].rchild);
}
//后序
void post(int root){
	if(root==-1){
		return;
	}
	post(tree[root].lchild);
	post(tree[root].rchild);
	//访问该节点
	visit(tree[root].data);
}
//层次
void dfs(int root){
	queue <int> q;
	q.push(root);
	while(!q.empty()){
		int now=q.front();
		q.pop();
		//访问该节点
		visit(tree[root].data);
		if(tree[now].lchild!=-1){
			q.push(tree[now].lchild);
		}
		if(tree[now].rchild!=-1){
			q.push(tree[now].rchild);
		}
	}
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值