前中后序建立树或者直接历遍

前中后序建立树或者直接历遍

代码实现

void postOrder(int root,int start,int end)
{
    if (start > end)
        return;
    int index = start;
    while (inOrder[index] != preOrder[root] )
        index++;
    postOrder(root + 1, start, index - 1);
    postOrder(root + index - start + 1, index + 1, end);
    cout << preOrder[root];
    return;
}

简单介绍:

这时利用前序中序直接输出后序的函数。直接把输出语句改成将数据赋值到节点,就变成一个建树函数。

代码拓展:后序中序输出前序函数

void pre_order(int root,int start,int end)
{
    if (start > end)
        return;
    int index = start;
    while (inOrder[index] != postOrder[root])
        index++;
    cout << postOrder[root];
    pre_order(root - end + index - 1, start, index - 1);
    pre_order(root - 1, index + 1, end);
    return;
}

简单介绍:

作用相同,改成了后序中序出前序。

思路:

  1. 参数意义:root为前序(后序)中根节点的位置,start和end是中序的起点下标和终点下标;
  2. 递归出口:当发现end比start小,说明已经完成,可以退出了;
  3. 递归主体:
    • 令index为start,自加,直到找到根节点在中序序列的位置。
    • 输出或者建树操作……
    • 左子树参数:
      • 前转后

        root:root+1(前序特点)

        start:start

        end:index-1(根节点坐标前一个是左子树的end)

      • 后转前

        root:root-end+index-1(计算右子树长度为end-index,减掉之后-1得root坐标)

        start:start

        end=index-1

    • 右子树参数
      • 前转后

        root:root+index-start+1(左子树长度为index-start,加上去之后+1得root坐标)

        start:index+1

        end:end

      • 后转前

        root:root-1(后序特点)

        start:index+1

        end:end

    • 然后return;
  4. 总结:

    将index找到之后,左子树长度为index-start,右子树长度为end-index。自己分析是是左是右,然后root+length之后再+1或者root-length之后-1;

原文地址:https://www.cnblogs.com/cell-coder/p/12348451.html

时间: 2024-10-14 05:51:39

前中后序建立树或者直接历遍的相关文章

二叉树的前序建立,前中后序遍历的非递归算法

二叉树的前序建立递归算法以及前中后序遍历的递归算法已经是人尽皆知了,递归算法也确实为代码的编写带来了很大的方便.然而,有时我们也确实需要它们的非递归算法.将递归算法转化为非递归算法可以帮助我们深入了解函数的调用与栈的原理.这里总结一下二叉树的这些重要的非递归算法. 一.前序建树 前序建树的基本思路是,接收用户输入的一组字符串,其中'#'代表空树,其他代表树结点的数据域值.例如,要建立如下一棵树 需要输入"AB#D##C##". 而非递归的思路是,1.设一个标志位来判断当前创建的结点是左

非递归前中后序遍历二叉树

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 写在前面: 最近准备找工作,捡起原来学习过的各种知识,加上一些自己的理解,梳理一下流程,巩固自己的认识,一步两步,一步两步... ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 二叉树的遍历是树操作的基础,一般的前中后序递归遍历比较简单,这里就不列出了,主要是非递归实

关于前中后序排列

大致可以总结如下: 前序排列(preorder):根左右 中序排列(inorder):左根右 后续排序(postorder):左右根 重点看"根"的位置,在最前面就是前序,中间就是中序,后面就是后序.补充一点,上述排列都是DFT(深度优先排列,Depth First Traversals).另有Breadth First or Level Order Traversal . 详解 首先上个例子: 中序是左根右,所以从最左的左节点4开始(其他的还不够"左",例如2,其

二叉树的前中后序遍历简单的递归

二叉树的遍历 无外乎广度和深度 其中深度又分为前中后序遍历三种情况  这三种遍历若只是递归方法 自然很是简单 但递归代码简单 若嵌套层次太深 会栈溢出 二叉树节点数据结构: struct Binary_node{    int val;    Binary_node *left;    Binary_node *right;    Binary_node(int v = 0, Binary_node *le = nullptr, Binary_node *ri = nullptr) :val(v

二叉树的建立及其前中后序遍历

1 //二叉树存储结构: 2 struct node 3 { 4 Int data; 5 node *lchild; 6 node *rchild; 7 }; 8 9 //二叉树在建树前根节点不存在: 10 Node *root = NULL; 11 12 //新建结点: 13 node *newNode(int v) 14 { 15 node *Node = new node; 16 Node->data = v; 17 Node->lchild = NULL; 18 Node->rc

树的前中后序遍历和层次遍历

遍历规则 前序遍历:根结点 ---> 左子树 ---> 右子树 中序遍历:左子树---> 根结点 ---> 右子树 后序遍历:左子树 ---> 右子树 ---> 根结点 层次遍历:只需按层次遍历即可 注: 1.前序.中序.后序属于深度优先遍历(使用递归较为方便),层次遍历为广度优先遍历(一般实现需要借助其他数据结构的支撑,如下面的队列等). 2.中序遍历有个小技巧:对于给定的树,可以画垂线,从左到右即为中序遍历的次序. 代码实现 #include <iostrea

【算法导论】二叉树的前中后序非递归遍历实现

二叉树的递归遍历实现起来比较简单,而且代码简洁:而非递归遍历则不那么简单,我们需要利用另一种数据结构---栈来实现.二叉树的遍历又可以分为前序.中序和后序三种,它们是按照根结点在遍历时的位置划分的,前序遍历则根结点先被遍历,中序则根结点在左右叶子节点之间被遍历,后序则是根结点最后被遍历.三种非递归遍历中,前序和中序都不是太复制,而后序遍历则相对较难. 一.前序遍历 我们这里前序遍历按照"根-左-右"的顺序来遍历.这里按照"递归--非递归"的次序来研究,之后的几种亦是

飘逸的python - 极简的二叉树前中后序通杀函数

对于任一结点,可以按某种次序执行三个操作: 访问结点本身(N) 遍历该结点的左子树(L) 遍历该结点的右子树(R) 用来表示顺序,即,前序NLR/中序LNR/后序LRN. 下面我们用namedtuple来表达树,而通杀的遍历函数带一个order参数,只要我们把指定顺序传进去即可实现对应的遍历. #coding=utf-8 ''' 1 / / / 2 3 / \ / 4 5 6 / / 7 8 9 ''' from collections import namedtuple from sys im

二叉树的前中后序遍历

#include<stdio.h> #include<string.h> #include<stdlib.h> #define Size 100 #define Resize 10 typedef struct Bitnode{ //定义结点 char data; struct Bitnode *lchild,*rchild; }Bitnode,*Bitree; typedef struct Stack{ //定义栈 Bitree *base; int top; int