因为题目给的是结点的编号 所以用二叉树顺序存储实现
第一步还是要先从给的结点中找到根节点。因为结点之间的关系题目已经给出所以可以直接使用遍历。
遍历的方法有两种 一种是递归 另一种是用堆栈。
**
中序遍历用递归实现的代码
void inorder(int root){
if(root==-1) return;
inorder(tree[root].lchild);
printf("%d",root);
inorder(tree[root].rchild);
}
中序遍历用堆栈实现的代码
在这里插入代码片
#include<cstdio>
#include<queue>
#include<stack>
using namespace std;
struct node{
int lchild;
int rchild;
int root;
}tree[20];
void inorder(int root);
void leaveorder(int root);
int in[20];
int index= 0;
int n;
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++){
tree[i].lchild = -1;
tree[i].rchild = -1;
tree[i].root = -1;
}
for(int i=0;i<n;i++){
char l,r;
scanf("\n%c %c",&l,&r);
if(l!='-'){
tree[i].lchild = l-'0';
tree[l-'0'].root = 0;
}else tree[i].lchild = -1;
if(r!='-'){
tree[i].rchild = r-'0';
tree[r-'0'].root = 0;
}else tree[i].rchild = -1;
}
int gen;
for(int i=0;i<n;i++){
if(tree[i].root==-1){
gen =i;
break;
}
}
leaveorder(gen);
printf("\n");
inorder(gen);
return 0;
}
void leaveorder(int root)
{
int space = 0;
queue<int>qu;
qu.push(root);
while(qu.empty()!=true){
int node = qu.front();
if(space) printf(" ");
printf("%d",node);
space = 1;
qu.pop();
if(tree[node].rchild!=-1) qu.push(tree[node].rchild);
if(tree[node].lchild!=-1) qu.push(tree[node].lchild);
}
}
void inorder(int root){
int node;
int space = 0;
stack<int> st;
st.push(root);
node = root;
while(st.empty()!=true||node!=-1){
while(node!=-1){
st.push(node);
node = tree[node].lchild;
}
if(st.empty()!=true){
node = st.top();
st.pop();
in[index] = node;
node = tree[node].rchild;
index++;
}
}
for(int i =n-1;i>=0;i--){
if(space) printf(" ");
printf("%d",in[i]);
space =1;
}
}