静态实现就是使用数组,要弄清楚这里的root就是个数字
#include <stdio.h>
#include <queue>
using namespace std;
const int maxn = 100;
struct node{
int data;
int lchild;
int rchild;
}Node[maxn];
int index = 0;
int newNode(int v){
Node[index].data = v;
Node[index].lchild = -1;
Node[index].rchild = -1;
return index++;
printf("1");
}
//查找,root为根据节点在数组中的下标
void search(int root,int x,int newdata){
if(root == -1){
return;
}
if(Node[root].data == x){
Node[root].data = 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(Node[root].lchild>=0){//左子树非空
insert(Node[root].lchild,x);
}
else{
insert(Node[root].rchild,x);
}
}
//二叉树的建立,函数返回根节点root的下标
int Creat(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;
}
printf("%d ",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 ",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 ",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[now].lchild);
if(Node[now].rchild != -1) q.push(Node[now].rchild);
}
}
int main(){
int n = 10;
int data[20] = {12,5,3,2,6,7,10,11,9,1};
int start = Creat(data,10);
printf("先序遍历为:\n");
preorder(start);
printf("\n中序遍历为:\n");
inorder(start);
printf("\n后序遍历为:\n");
postorder(start);
printf("\n层序遍历为:\n");
Layerorder(start);
search(start,6,666);//找到数据为6这个节点,修改为666
printf("\n将为6的节点数据修改为666,后序遍历为:\n");
postorder(start);
}