如何由二叉树的先序和中序序列画出二叉树

  今天数据结构的考试有这个题,做了好久,下来后,我好好地在网上查了一下,并结合我自己的理解,总结出来了一个比较好理解的方法。这个方法可以说做起这样的题又快又准。
 (概括为一个口诀:先序放中间,中序分两边)
 
 基本思想就是递归:

1.取出先序的第一个节点。(先序中的节点为根节点)
2.用第一个节点可以将中序分成左右子树,然后又取出先序的第二个节点
   再次将左右子树再次划分,
3,当将中序全部划分为单个点时就结束。

例如:假设一颗二叉树的先序序列是:EBADCFHGIKJ。 中序序列为:ABCDEFGHIJK。请画出该二叉树



如何由二叉树的先序和中序序列画出二叉树 - wz625 - wanna

生成的二叉树如下图所示:
如何由二叉树的先序和中序序列画出二叉树 - wz625 - wanna
 


 问题扩展:
      1,只有先序和中序 或 中序和后序可以确定一颗树。先序和后序确定不了一颗树。
      2,如何根据中序和后序确定一颗树呢?
             方法跟上面的由先序和中序确定一颗树的思想大同小异。
             例如:中序:BEDAC  后序:   EDBCA
                                                              <---------找根的方向
                 先是A是根,故有根A,左子树为BED  右子树为C
                 然后是C为根,C的左右子树均为空。
                 然后是B为根,B的左子树为空,右子树为ED
                 然后是D为根,D的左子树为E,右子树为空。
                  然后是E为根,左右子树均为空。

            根据上面几个步骤就可以将确定的树画出来。

转载于:https://www.cnblogs.com/ct0421/p/3772461.html

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
是的,可以使用递归的方式来构造二叉树,并且通过比较构造出来的二叉树先序中序序列是否与给定的序列一致来验证其正确性。 具体步骤如下: 1.将先序序列的第一个元素作为根节点。 2.在中序序列中找到根节点所在的位置,将序列分为左子树和右子树两部分。 3.根据左子树和右子树的长度,在先序序列中找到左子树和右子树的元素。 4.递归构造左子树和右子树,连接到根节点上。 5.最后,比较构造出来的二叉树先序中序序列是否与给定的序列一致。 代码实现如下: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct TreeNode { char val; struct TreeNode *left; struct TreeNode *right; } TreeNode; TreeNode* buildTree(char* preorder, char* inorder, int preStart, int preEnd, int inStart, int inEnd) { if (preStart > preEnd || inStart > inEnd) { return NULL; } TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode)); root->val = preorder[preStart]; root->left = NULL; root->right = NULL; int i; for (i = inStart; i <= inEnd; i++) { if (inorder[i] == root->val) { break; } } int leftLen = i - inStart; root->left = buildTree(preorder, inorder, preStart + 1, preStart + leftLen, inStart, i - 1); root->right = buildTree(preorder, inorder, preStart + leftLen + 1, preEnd, i + 1, inEnd); return root; } void preorderTraversal(TreeNode* root) { if (root == NULL) { return; } printf("%c ", root->val); preorderTraversal(root->left); preorderTraversal(root->right); } void inorderTraversal(TreeNode* root) { if (root == NULL) { return; } inorderTraversal(root->left); printf("%c ", root->val); inorderTraversal(root->right); } int main() { char preorder[] = "ABDECF"; char inorder[] = "DBEAFC"; int len = strlen(preorder); TreeNode* root = buildTree(preorder, inorder, 0, len - 1, 0, len - 1); printf("Preorder traversal: "); preorderTraversal(root); printf("\n"); printf("Inorder traversal: "); inorderTraversal(root); printf("\n"); return 0; } ``` 输出结果为: ``` Preorder traversal: A B D E C F Inorder traversal: D B E A F C ``` 可以看到,构造出来的二叉树先序中序序列与给定的序列一致,说明构造正确。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值