C ++从树的Preorder和Inorder遍历中打印Postorder遍历
给定树的预排序和有序遍历
例如:给出一棵树
Inorder traversal of the given tree is: - 9, 20, 29, 30, 50, 90, 100, 120Preorder traversal of the given tree is: - 30, 20, 9, 29, 90, 50, 120, 100Postorder traversal of the given tree is: - 9, 29, 20, 50, 100, 120, 90, 30
算法:
众所周知,在遍历遍历中,根始终是第一个元素,因此我们将递归地找到左和右子树,最后找到根,为此,我们必须按顺序搜索左和右子树。首先,我们将按顺序搜索preorder的元素,因为按顺序搜索的元素索引之后的元素是右子树的成员,而索引之前的元素是右子树的元素,而被搜索的元素是该子树的根。
考虑一下程序:
#include<iostream>using namespace std;
/*Find x in inOrder*/
int search(int arr[],int x,int n)
{
int i;
for(i=0;i<n;i++)
{
if(arr[i]==x)
return i; /*return the index of the element found*/
}
return -1;
}
void printPostOrder(int inOrder[],int preOrder[],int n)
{
int rootNode=search(inOrder,preOrder[0],n);
if(rootNode) /*If right subtree is not empty */
{
printPostOrder(inOrder,preOrder+1,rootNode);
}
if(rootNode!=n-1) /*If left subtree is not empty*/
{
printPostOrder(inOrder+rootNode+1,preOrder+rootNode+1,n-rootNode-1);
}
cout<<preOrder[0]<<" ";
}
int main(){
int inOrder[]={9,20,29,30,50,90,100,120};
int preOrder[]={30,20,9,29,90,50,120,100};
int n=sizeof(inOrder)/sizeof(inOrder[0]);
cout<<"Post order : ";
printPostOrder(inOrder,preOrder,n);
cout<<endl;
return 0;
}
输出结果
Post order : 9 29 20 50 100 120 90 30
以上是 C ++从树的Preorder和Inorder遍历中打印Postorder遍历 的全部内容, 来源链接: utcz.com/z/330805.html