struct node{
typename data;
node* lchild;
node* rchild;
}node[maxn];
//节点的动态生成可以变为静态指定:
int index = 0;
int newNode(int v){
node[index].data = v;
node[index].lchild = -1;
node[index].rchild = -1;
return index++;
}
//二叉树查找
void search(int root, int x, int newdata){
if(root == -1){
//用-1来代表空树
return ;
//空树,死循环(递归边界)
}
if(node[root].data == x){
node[root].data = newdata;
//如果找到数据域为x的节点,把他修改为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);
return ;
}
if(由二叉树性质x应插在左子树)
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]);
//将data[0]~data[n-1]插入二叉树中;
}
return root;
}
二叉树的前序中序后序层序遍历
//前序
void preorder(int root){
if(root == -1)
return ;
//到达空树,递归边界
//访问根节点root,比如操作:将根节点输出
printf("%d\n", node[root].data);
//访问左子树
preorder(node[root].lchild);
//访问右子树
preorder(node[root].rchild);
}
//中序
void inorder(int root){
if(root == -1){
return ;
}
inorder(node[root].lchild);
printf("%d\n", node[root].data);
inorder(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){
queue<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[root].lchild);
//左子树非空
if(node[now].rchild != -1)
q.push(node[root].rchild);
//右子树非空
}
}