//二叉树的静态实现
//静态是指;结点的左右指针域用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);
}
}