9.0二叉树静态写法

//二叉树的静态实现
//静态是指;结点的左右指针域用int型代替,用来表示左右子树的根节点在数组中的下标。
//为此要建立一个大小为结点上限个数的node型数组,所有动态生成的结点都直接使用数组中的结点
//所有指针的操作都改为对数组下标的访问

//结点定义
struct node{
	typename data;
	int lchild;
	int rchild;
}Node[maxn];

//2.结点生成
int index=0;
int newNode(int v) //分配一个Node数组中的结点给新的结点,index为其下标 
{
	Node[index].data=v;//数据域为v
	Node[index].lchild=-1;//以-1或maxn表示空,因为数组范围为0-maxn-1
	Node[index].rchild=-1; 
	return index++;
}

// 查找,root为根节点在数组中的下标
void search(int root,int x,int newdata)
{
	if(root==-1) //已-1代替NULL 
		return;//空树,死胡同 
	if(Node[root].data==x)//找到数据域为x的结点,将其值修改为newdata 
		Node[root]=newdata;
	search(Node[root].lchild,x,newdata);
	search(Node[root].rchild,x,newdata);
 } 

//插入 , root为根节点在数组中的下标
void insert(int &root,int x)//记得加引用
{
	if(root==-1) //空树,查找失败,也即插入位置 
	{
		root=newNode(x); //给root附以新节点 
		return ;
	}
	if(由二叉树性质知应该插在左子树)
	{
		insert(Node[root].lchild,x);//往左子树搜素,递归式 
	} 
	else
		insert(Node[root].rchild,x);//往左子树搜素,递归式
 } 
 
//二叉树的建立,函数返回根节点root的下标
int create(int data[],int n)
{
	int root=-1;
	for(int i=0;i<n;++i)
		insert(root,data[i]);
	return root;
 } 


//先序遍历
void preorder( int root)
{
	if(root==-1)
		return ;
	printf("%d\n",Node[root].data);
	preorder(Node[root].lchild);
	preorder(Node[root].rchild);
 } 
 
//中序遍历
void inorder(int root)
{
	if(root=-1)
		return ;
	preorder(Node[root].lchild);
	printf("%d\n",Node[root].data);
	preorder(Node[root].rchild); 
 } 
 
//后序遍历
void postorder(int root)
{
	if(root=-1)
		return;
	postorder(Node[root].lchild);
	postorder(Node[root].rchild);
	printf("%d\n",Node[root].data);
 }

//层次遍历
void layerorder(int root)
{
	queuq<int>q;
	q.push(root);
	while(!q.empty())
	{
		int now=q.front();
		q.pop();
		printf("%d",Node[now].data);
		if(Node[now].lchild!=-1)
			q.push(Node[now].lchild);
		if(Node[now].rchild1=-1)
			q.push(Node[now].rchild);
	}
} 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值