zoukankan      html  css  js  c++  java
  • 树与二叉树 | 实验3:由遍历序列构造二叉树

    实验3:由遍历序列构造二叉树

    二叉树构造定理:

    • 定理7.1:任何n(n>0)个不同结点的二又树,都可由它的中序序列和先序序列唯一地确定。
    • 定理7.2:任何n(n>0)个不同结点的二又树,都可由它的中序序列和后序序列唯一地确定。

    题目: 已知先序序列为ABDGCEF,中序序列为DGBAECF,则构造二叉树的过程如下所示。

     

     C语言代码示例:

     1 #include<stdio.h>
     2 #include<malloc.h>
     3  
     4 typedef struct node
     5 {
     6     struct node *lchild, *rchild;
     7     char data;
     8 } BTNode;
     9  
    10 BTNode* CreateBTree(char *pre, char *in, int n)
    11 {
    12     int k;
    13     char *p;
    14     if (n <= 0)
    15         return NULL;
    16     BTNode *b = (BTNode*)malloc(sizeof(BTNode));
    17     b->data = *pre;
    18     for (p = in; p < in + n; ++p)
    19         if (*p == *pre)
    20             break;
    21     k = p-in;
    22     b->lchild = CreateBTree(pre+1, in, k);
    23     b->rchild = CreateBTree(pre+k+1, p+1, n-k-1);
    24     return b;
    25 }
    26  
    27 void dispBTree(BTNode *b) 
    28 {
    29     if(b!= NULL)
    30     {
    31         printf("%c", b->data);
    32         if(b->lchild != NULL || b->rchild != NULL)
    33         {
    34             printf("(");
    35             dispBTree(b->lchild); 
    36             if(b->rchild != NULL)
    37               printf(",");
    38             dispBTree(b->rchild);
    39             printf(")");                 
    40         }
    41     }
    42  } 
    43  
    44 int main()
    45 {
    46     BTNode* b;
    47     char pre[] = "ABDGCEF";
    48     char in[] = "DGBAECF";
    49     int n = 7;
    50     b = CreateBTree(pre, in, 7);
    51     dispBTree(b);
    52     return 0; 
    53 }
    View Code

     运行结果:

    C++代码示例:

     1 /**
     2  * Definition for a binary tree node.
     3  * struct TreeNode {
     4  *     int val;
     5  *     TreeNode *left;
     6  *     TreeNode *right;
     7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     8  * };
     9  */
    10 class Solution {
    11 public:
    12     TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) 
    13     {
    14       TreeNode *b = CreateBTree(preorder.begin(), inorder.begin(), inorder.size());
    15         return b;    
    16     }
    17     
    18     TreeNode* CreateBTree(vector<int>::iterator p, vector<int>::iterator q, int n)
    19     {
    20         TreeNode *b;
    21         auto s = q;
    22         int k;
    23         if(n <= 0)
    24             return nullptr;
    25         b = new TreeNode(*p);
    26         for(; s < q + n; ++s)
    27             if(*s == *p)
    28                 break;
    29         k = s - q;
    30         b->left = CreateBTree(p+1, q, k);
    31         b->right = CreateBTree(p+k+1, s+1, n-k-1);
    32         return b;
    33     }
    34 };
    View Code
  • 相关阅读:
    方差分析 | ANOVA | 原理 | R代码 | 进阶 | one way and two way | Analysis of Variance
    GT sport真实赛道详解
    如何成为F1车手?
    统计学 | 漫想
    (转)什么是P问题、NP问题和NPC问题
    一个完整的成年果蝇大脑的电子显微镜图谱 | A Complete Electron Microscopy Volume of the Brain of Adult Drosophila melanogaster
    文献导读 | A Pan-Cancer Analysis of Enhancer Expression in Nearly 9000 Patient Samples
    综述
    GSEA
    (转)决定系数R2
  • 原文地址:https://www.cnblogs.com/sunbines/p/9675280.html
Copyright © 2011-2022 走看看