由中序和后序输出前序
显而易见,可以用递归实现:
由二叉树的定义可知,已知前序和中序,或者后序和中序均可以求出整个二叉树
原理:
前序+中序:前序的第一个节点必定为根节点,找到前序的第一个节点在中序中的位置
此时,在中序中,此节点左边为左子树,右边为右子树,以此类推,可以根据递归的思想进行实现
同理,后序+中序:后序的最后一个节点必定为根节点,找到后序的最后一个节点在中序中的位置,左边为左子树,右边为右子树…
递归结束条件:此节点既无左子树又无右子树
首先进行二叉树的定义:
typedef struct bitnode
{
ElementType data;
struct bitnode*left,*right;
}bitnode,*bitree;
然后是函数(由中序和后序求得二叉树)
bitree CreateTree(int *End,int *Mid,int n) //根据后序和中序建立二叉树
{
bitree T; //root节点,新二叉树的根节点
T = (bitree)malloc(sizeof(bitnode));
if(n<=0)
return NULL;
int *p = Mid; //定义一个指针指向中序开头
while(*p!=*(End+n-1)) //让指针指向后序的最后一个节点,这个节点是中序的头节点,左边为左树,右边为右数
{
p++;
}
T->data = *p; //把后序的最后一个节点的值给根节点,从此开始递归判断
int len = p - Mid; //长度
T->left = CreateTree(End,Mid,len);
T->right = CreateTree(End+len,Mid+len+1,n-len-1);
return T;
}
前序遍历二叉树并输出:
void Order(bitree T)
{
if(T)
{
cout<<" "<<T->data;
Order(T->left);
Order(T->right);
}
}
主函数:
int main