通过后相和中相遍历的输出介绍了前相遍历的问题,分析过程1 .首先通过后相遍历确定根节点2 .在中相遍历中找到根节点对应的下标3 .计算分割区间的左右位置4 .用结束条件函数码实现完整的代码汇总
主题介绍
在这个问题中,要求根据给定的一棵二叉树的后相遍历和中相遍历的结果,输出该树的先相遍历的结果。
输入格式:
第一行给定正整数N(30 ),是树中节点的数目。 接下来的两行向每行给出N个整数,每个整数对应于后一行和中行遍历的结果,并且数字之间是以空格分隔的。 主题保证输入正确对应二叉树。
输出格式:
在一行中输出Preorder:和树的第一个遍历结果。 数字之间有一个空格,行尾不能有多余的空格。
输入样例:
7
2 3 1 5 7 6 4
1 2 3 4 5 6 7
输出样例:
Preorder: 4 1 3 2 6 5 7
分析过程通过主题给定的例子直接分析:
1 .首先,通过后续遍历确定根节点2 .遍历中找到与根节点相对应的下标,先处理父节点
treenode * traversal (vectorintinorder,int inorderBegin,int inorderEnd,vectorint postorder,int postorderBegin,int postorder //创建父亲节点for (delimiter index=in order begin; delimiterIndex inorderEnd; delimiter index (if (in order [ delimiter index ]==root value ) ) /找出与中顺序扫描中父亲节点对应的下标break; }3.计算分割区间左右位置,计算中顺序扫描的左区间边界,计算右区间边界。 对应二叉树的先行序列制作。
注意:区间格式为[.],Begin均可获取,End无法获取
root-left=traversal(inorder,inorderBegin,delimiterIndex,postorder,postorderbegindelimiterindex ) delimiterIndex 1,inorderEnd,postorder,postorderbegindelimiterindex-in order begin,postorderbegin 4.如果结束条件后区间的区间长度为零,则为空
postorder begin==postorder end )返回空值; 区间长度为1时,不需要额外计算区间。 区间只有一个值。 返回超级用户
密码结束-密码边界==1)返回根; 函数代码实现treenode * traversal (vectorintinorder,int inorderBegin,int inorderEnd,vectorint postorder,int postorderBegin,int treenode * root=new treenode (root value ); //创建父亲节点if (postorder end-postorder begin==1)返回根; int delimiter索引; //分割位置的下标for (delimiter index=in order begin; delimiterIndex inorderEnd; delimiter index (if (in order [ delimiter index ]==root value ) ) /找出与中顺序扫描中父亲节点对应的下标break; }root-left=traversal(inorder,inorderBegin,delimiterIndex,postorder,postorderbegindelimiterinnniter delimiterIndex 1,inorderEnd,postorder,postorderbegindelimiterindex-in order begin,postorderbegin return root; }完整代码如下:
# include bits/stdc.husingnamespacestd; struct TreeNode { int val; TreeNode* left; TreeNode* right; TreeNode(:val )0)、left ) nullptr )、right ) nullptr ) treenode ) intvalue ) 3360val ) value )、left ) nullptr tretr int inorderEnd,vectorint postorder,int postorderBegin,int postorder begin introotvalue=postorder [ postorder end-1 ]; treenode * root=new treenode (root value ); //创建父亲节点if (postorder end-postorder begin==1)返回根; int delimiter索引; //分割位置的下标for (delimiter index=in order begin; delimiterIndex inorderEnd; delimiter index (if (in order [ delimiter index ]==root value ) break; root-left=traversal(inorder,inorderBegin,delimiterIndex,postorder,postorderbegindelimiterindex ) delimiterIndex 1,inorderEnd,postorder,postorderbegindelimiterindex-in order begin,postorderbegin return root; }voidpreorder(treenode*node ) if ) node==nullptr ) return; cout ' ' node-val; preorder(node-left ); preorder(node-right ); (}int main ) ) { int n; cin n; vectorintinorder(n ); Vectorintpostorder(n ); for(intI=0; i n; I ) cin postorder[i]; for(intI=0; i n; I ) cin inorder[i]; cout 'Preorder: ' preorder(traversal(inorder,0,n,postorder,0,n ); 返回0; }可以将包含后行和中行遍历的容器放在主函数之外,以便在函数传递参数时可以减少两个参数,从而简化代码。