数据结构-二叉树-(先序|后序)+中序求(后序|先序)笔记

//已知先序中序
#include <iostream>
#include <string>
using namespace std;
struct Node{
    char data;
    Node *left;
    Node *right;
};
Node *search(char *pre,char *in,int length)
{
    if (length==0)
        return NULL;
    else {
        Node *node=new Node;
        node->data=*pre;    //根结点
        int index;
        for(index=0;index<length;index++)
        {
            if(in[index]==*pre) break;    //在中序中定位根结点
        }
        node->left=search(in,pre+1,index);
        //在先序中左子树的根节点是pre的下一个即为pre+1
        //把中序中根结点左侧的部分当作左子树的先序遍历
        //index计数出左树的length
        node->right=search(in+index+1,pre+index+1,length-(index+1));
        
        //右树的length为总length减去(index+1根结点)
        cout<<node->data<<endl;
        return node;
    }}
    
int main()
{
    char *pre="EBADCFHGIKJ";
    char *in="ABCDEFGHIJ";
    search(pre,in,10);
    return 0;
}

以上程序是可行的

已已知先序和中序为例,先通过先序求得根结点,再在中序中定位根结点,得知左右子树,进而能够在先序中分开左右子树。

后序加中序同理。

核心步骤我认为是找到根结点后定位的这一步,是把整棵树化解开来的基础。

猜你喜欢

转载自www.cnblogs.com/loglian/p/12909984.html