二叉树的静态实现,能完全不使用指针来解题
  • 二叉树定义
// 定义 
struct Node{
   
	int data; //数据域
	int lchild;//指向左子树根结点的指针
	int rchild;//指向右子树根结点的指针 
}node[maxn];
  • 新建结点
//新建结点 
int index=0;
int newNode(int data){
   
	node[index].data=data;
	node[index].lchild=-1;
	node[index].rchild=-1;
	return index++;
}
  • 插入
//插入
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);
	}
} 
  • 创建
//创建
int Create(int data[],int n){
   
	int root=-1;
	for(int i=0;i<n;i++){
   
		insert(root,data[i]);
	}
	return 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);
}
  • 先序遍历
//先序遍历
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 ;
	}
	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[root].data);
		if(node[now].lchild!=-1) q.push(node[now].lchild);
		if(node[now].rchild!=-1) q.push(node[now].rchild);
	}
}

题目链接

1020 Tree Traversals (25)

1086 Tree Traversals Again (25)

1102 Invert a Binary Tree (25)

1119 Pre- and Post-order Traversals (30)

1127 ZigZagging on a Tree (30)

1138 Postorder Traversal (25)

1151 LCA in a Binary Tree (30)