第九周项目二 二叉树的先序,中序,后序遍历

  1. 烟台大学计算机学院  
  2.   
  3. 作者:王雪行  
  4.   
  5. 问题描述:实现二叉树的先序、中序、后序遍历的递归算法, 
  6. 并对用”A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))”创建的二叉树进行测试。  
  7.   
  8. 输入描述:无 
  9.   
  10. 输出描述:输出二叉树先中后序遍历结果 
  11.   
  12. */   
  13.   
  14.   
  15. #include <stdio.h>  
  16.   
  17. #include "../btree.h"//用到了btree.h  
  18.   
  19. void PreOrder(BTNode *b)        //先序遍历的递归算法  
  20. {  
  21.     if (b!=NULL)  
  22.     {  
  23.         printf("%c ",b->data);  //访问根节点  
  24.         PreOrder(b->lchild);    //递归访问左子树  
  25.         PreOrder(b->rchild);    //递归访问右子树  
  26.     }  
  27. }  
  28.   
  29. void InOrder(BTNode *b)         //中序遍历的递归算法  
  30. {  
  31.     if (b!=NULL)  
  32.     {  
  33.         InOrder(b->lchild);     //递归访问左子树  
  34.         printf("%c ",b->data);  //访问根节点  
  35.         InOrder(b->rchild);     //递归访问右子树  
  36.     }  
  37. }  
  38.   
  39. void PostOrder(BTNode *b)       //后序遍历的递归算法  
  40. {  
  41.     if (b!=NULL)  
  42.     {  
  43.         PostOrder(b->lchild);   //递归访问左子树  
  44.         PostOrder(b->rchild);   //递归访问右子树  
  45.         printf("%c ",b->data);  //访问根节点  
  46.     }  
  47. }  
  48.   
  49. int main()  
  50. {  
  51.     BTNode *p;  
  52.     CreateBTNode(p,"A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))");  
  53.     printf("先序:");  
  54.     PreOrder(p);  
  55.     printf("\n");  
  56.      printf("中序:");  
  57.     InOrder(p);  
  58.     printf("\n");  
  59.      printf("后序:");  
  60.     PostOrder(p);  
  61.     printf("\n");  
  62.   
  63.     DestroyBTNode(p);  
  64.   
  65.     return 0;  
  66.   
  67.   
  68.   
  69. }  

运行结果:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
指针二叉树中序遍历顺序是左子树-根节点-右子树,先序遍历顺序是根节点-左子树-右子树,后序遍历顺序是左子树-右子树-根节点。 因此,我们可以通过先序中序遍历重建二叉树,然后再进行后序遍历输出。 具体实现过程如下: 1. 定义一个函数build_tree(preorder, inorder),用于根据先序中序遍历构建二叉树。 2. 在build_tree函数中,首先判断preorder和inorder是否为空,如果其中有一个为空,则返回None。 3. 接着,取出preorder的第一个元素作为根节点,创建一个新节点,并将其值赋为根节点的值。 4. 在inorder中找到根节点的位置,则根节点左边的元素是左子树的中序遍历,右边的元素是右子树的中序遍历。 5. 根据左子树的中序遍历长度,在preorder中找到左子树的先序遍历,右边的元素是右子树的先序遍历。 6. 递归调用build_tree函数,分别构建左子树和右子树,并将其作为根节点的左子节点和右子节点。 7. 最后,返回根节点。 8. 定义一个函数postorder_traversal(root),用于后序遍历输出二叉树。 9. 在postorder_traversal函数中,首先判断root是否为空,如果为空,则返回空列表。 10. 递归调用postorder_traversal函数,分别输出左子树、右子树和根节点的值,并将其添加到结果列表中。 11. 最后,返回结果列表。 代码实现如下: ```python class TreeNode: def __init__(self, val): self.val = val self.left = None self.right = None def build_tree(preorder, inorder): if not preorder or not inorder: return None root_val = preorder.pop(0) root = TreeNode(root_val) inorder_index = inorder.index(root_val) root.left = build_tree(preorder, inorder[:inorder_index]) root.right = build_tree(preorder, inorder[inorder_index+1:]) return root def postorder_traversal(root): if not root: return [] left = postorder_traversal(root.left) right = postorder_traversal(root.right) return left + right + [root.val] def inorder_preorder_to_postorder(inorder, preorder): root = build_tree(preorder, inorder) return postorder_traversal(root) ``` 测试代码: ```python inorder = [4, 2, 5, 1, 3, 6] preorder = [1, 2, 4, 5, 3, 6] postorder = inorder_preorder_to_postorder(inorder, preorder) print(postorder) # [4, 5, 2, 6, 3, 1] ``` 输出结果为:[4, 5, 2, 6, 3, 1],符合预期。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值