首页 > 编程知识 正文

后序遍历诀窍,无向图的深度优先遍历例题

时间:2023-05-04 23:45:24 阅读:157364 作者:3628

通过后相和中相遍历的输出介绍了前相遍历的问题,分析过程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; }可以将包含后行和中行遍历的容器放在主函数之外,以便在函数传递参数时可以减少两个参数,从而简化代码。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。