前言
由于之前王老师讲了怎么通过递归的方式利用 遍历序列的输入顺序构建 二叉树
一、思想基于递归遍历
例如 先序遍历 1 2 4 0 0 5 6 0 0 7 0 0 3 0 0 -1 (0表示当前结点为空,-1表示输入结束)
二、构建二叉树
1.先判断遍历顺序
如上面写的 先序序列
2.根据遍历类型写代码
代码如下(示例):
#include<bits/stdc++.h>
using namespace std;//根据遍历的次序,构建二叉树
struct BitTree{
int data;
struct BitTree *left,*right;
};
void PreCreatTree(BitTree * &root) //这个比层次遍历简洁多了,而且不需要额外的0结点;
{
int d;
root=(BitTree *)malloc(sizeof(BitTree));
root->left=NULL,root->right=NULL;
scanf("%d",&d);
if(d==-1) return;
if(d==0)
{
free(root);
root=NULL;
return;
}
else root->data=d;
PreCreatTree(root->left);
PreCreatTree(root->right);
}
void PreOrder(BitTree *head)
{
if(head==NULL) return;
else{
printf(" %d",head->data);
PreOrder(head->left);
PreOrder(head->right);
}
}
void InOrder(BitTree *head){
if(head==NULL) return;
else{
InOrder(head->left);
printf(" %d",head->data);
InOrder(head->right);
}
}
void PostOrder(BitTree *head){
if(head==NULL) return;
else{
PostOrder(head->left);
PostOrder(head->right);
printf(" %d",head->data);
}
}
int main()
{
BitTree *head=NULL;
PreCreatTree(head);
PreOrder(head);
cout<<endl;
InOrder(head);
cout<<endl;
PostOrder(head);
return(0);
}
//测试数据:1 2 4 0 0 5 6 0 0 7 0 0 3 0 0 -1 要给先序序列
总结
根据遍历的方式构建二叉树,很方便,不需要像层次遍历一样,还要用到队列,或者栈等数据结构。但是相关的题目很少看到,希望之后TZOJ把这个内容到实验课程里。