二叉树前序序列和中序序列转为后序序列

Posted 2018shawn

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树前序序列和中序序列转为后序序列相关的知识,希望对你有一定的参考价值。

 

/* program to construct tree using inorder and preorder traversals */
#include <stdio.h> 
#include <stdlib.h> 
  
/* A binary tree node has data, pointer to left child 
   and a pointer to right child */
struct node { 
    char data; 
    struct node* left; 
    struct node* right; 
}; 
  
/* Prototypes for utility functions */
int search(char arr[], int strt, int end, char value); 
struct node* newNode(char data); 
  
/* Recursive function to construct binary of size len from 
   Inorder traversal in[] and Preorder traversal pre[].  Initial values 
   of inStrt and inEnd should be 0 and len -1.  The function doesn‘t 
   do any error checking for cases where inorder and preorder 
   do not form a tree */
struct node* buildTree(char in[], char pre[], int inStrt, int inEnd) 
{ 
    static int preIndex = 0; 
  
    if (inStrt > inEnd) 
        return NULL; 
  
    /* Pick current node from Preorder traversal using preIndex 
    and increment preIndex */
    struct node* tNode = newNode(pre[preIndex++]); 
  
    /* If this node has no children then return */
    if (inStrt == inEnd) 
        return tNode; 
  
    /* Else find the index of this node in Inorder traversal */
    int inIndex = search(in, inStrt, inEnd, tNode->data); 
  
    /* Using index in Inorder traversal, construct left and 
     right subtress */
    tNode->left = buildTree(in, pre, inStrt, inIndex - 1); 
    tNode->right = buildTree(in, pre, inIndex + 1, inEnd); 
  
    return tNode; 
} 
  
/* UTILITY FUNCTIONS */
/* Function to find index of value in arr[start...end] 
   The function assumes that value is present in in[] */
int search(char arr[], int strt, int end, char value) 
{ 
    int i; 
    for (i = strt; i <= end; i++) { 
        if (arr[i] == value) 
            return i; 
    } 
} 
  
/* Helper function that allocates a new node with the 
   given data and NULL left and right pointers. */
struct node* newNode(char data) 
{ 
    struct node* node = (struct node*)malloc(sizeof(struct node)); 
    node->data = data; 
    node->left = NULL; 
    node->right = NULL; 
  
    return (node); 
} 
  
/* This funtcion is here just to test buildTree() */
void printInorder(struct node* node) 
{ 
    if (node == NULL) 
        return; 
  
    /* first recur on left child */
    printInorder(node->left); 
  
    /* then print the data of node */
    printf("%c ", node->data); 
  
    /* now recur on right child */
    printInorder(node->right); 
} 
  
/* Driver program to test above functions */
int main() 
{ 
    char in[] = { D, B, E, A, F, C }; 
    char pre[] = { A, B, D, E, C, F }; 
    int len = sizeof(in) / sizeof(in[0]); 
    struct node* root = buildTree(in, pre, 0, len - 1); 
  
    /* Let us test the built tree by printing Insorder traversal */
    printf("Inorder traversal of the constructed tree is 
"); 
    printInorder(root); 
    getchar(); 
} 

 

参考网址:https://www.geeksforgeeks.org/construct-tree-from-given-inorder-and-preorder-traversal/

以上是关于二叉树前序序列和中序序列转为后序序列的主要内容,如果未能解决你的问题,请参考以下文章

二叉树中,啥是前序,中序。后序!

C语言编程:已知二叉树前序和中序,如何求出后序遍历?

已知一个二叉树的先序序列和中序序列,怎么求它的后序序列

通过遍历序列构造二叉树(扩展二叉树的先序先序和中序后序和中序层序和中序)附可执行完整代码

已知二叉树的中序序列和后序序列,怎么求前序序列

数据结构中已知前序序列和中序序列,怎么得出后序序列,谢谢回答!