数据结构学到二叉树了。觉得有点难了。
大家都知道,先序+中序或者中序+后序才能确定一棵二叉树。
这次用的是先序和中序构建二叉树,再用层序遍历输出。
先序:7 10 4 3 1 2 8 11
中序:4 10 3 1 7 11 8 2
那么层序就是
7 10 2 4 3 8 1 11
struct BinaryTree{
int data;
BinaryTree *left;
BinaryTree *right;
};
由于STL中没有树。所以只能手写啦、
我们知道二叉树的构建是通过递归实现的。
BinaryTree *BuildTree(int *pre,int *in,int n){
BinaryTree *Node;
//为了避免无限递归,做一个判空处理。
if(n<=0)
return 0;
Node=new BinaryTree;
//申请一个新结点
Node->data=pre[0];
//先序的第一个是根结点。下一次调用便是子树的结点
int i0=0;
//下面主要是找到中序中这个结点,左半部分是左子树,右半部分是右子树啦
for(int i=0;i<n;i++){
if(pre[0]==in[i])
i0=i;
}
//下面的这个递归确定可以自己下去手写模拟。
Node->left=BuildTree(pre+1,in,i0);
Node->right=BuildTree(pre+i0+1,in+i0+1,n-i0-1);
return Node;//
}
这样一趟下来我们就能在内存中,存下这个二叉树啦。
现在就是要层序遍历输出它。
用一个容器来存放数据。层序遍历主要是用队列实现。
void levelorder(BinaryTree *root){
queue <BinaryTree*> q;
//将根结点放进去
q.push(root);
while(!q.empty()){
//每次取队首元素。
BinaryTree *temp=q.front();
q.pop();
tree.push_back(temp->data);
//查看该结点是否有左右子树,有的话则入队,等待下一次放入容器
if(temp->left!=0){
q.push(temp->left);
}
if(temp->right!=0){
q.push(temp->right);
}
}
}
我们上述给的例子的确认过程应该这样
后面左右子树也依次类推、
左子树又以10为结点继续往下分析,右子树以2为结点往下分析。
所以层序输出时7 10 2 4 3 8 1 11
这里定义的vector是全局变量。
欢迎去这个OJ测试。题号:1104