建立二叉树的二叉链表存储结构

如果用大写字母标识二叉树结点,则一颗二叉树可以用符合下面语法图的字符序列表示。试编写递归程序,由这种形式的字符序列,建立相应的二叉树的二叉链表存储结构(附图见《严蔚敏:数据结构题集(C语言版)》第456.70)

输入如图所示的字符序列。

建立相应二叉树的二成叉链表存储结构,并先序遍历输出。

A(B(#,D),C(E(#,F),#))

AB#DCE#F#

#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;

typedef struct BiTNode
{
    char data;
    BiTNode *lchild;
    BiTNode *rchild;
}BiTNode, *PBiTNode;

int FindComma(char s[], int len)
{
    int match = 0;
    int i;
    for(i = 0; i < len; i++)
    {
        if(s[i] == '(')
            ++match;
        else if(s[i] == ')')
            --match;
        if(match==0 && s[i]==',')
            break;
    }
    return i;
}
PBiTNode CreateBiTree(char s[], int len)
{
//    if(len <= 0)
//        return NULL;
    if(s[0] == '0')
        return NULL;
    PBiTNode root = (PBiTNode)malloc(sizeof(BiTNode));
    root->data = s[0];
    if(len == 1)
    {
        root->lchild = NULL;
        root->rchild = NULL;
    }
    else
    {
        int commaPos = FindComma(s+2, len-2);
        root->lchild = CreateBiTree(s+2, commaPos);
        root->rchild = CreateBiTree(s+2+commaPos+1,len-3-commaPos-1);
    }
    return root;
}


void PostOrderTraverse(PBiTNode root)
{
    if(root)
    {
        printf("%c", root->data);

        PostOrderTraverse(root->lchild);
        PostOrderTraverse(root->rchild);
    }
}

int main()
{
    char str[200];
    cin >> str;
    PBiTNode T = (PBiTNode)malloc(sizeof(BiTNode));
    T = CreateBiTree(str, strlen(str));
    PostOrderTraverse(T);
    return 0;
}

你可能感兴趣的:(建立二叉树的二叉链表存储结构)