二叉树の存储结构

 二叉树的顺序存储:二叉树扩展为完全二叉树以后按照层次遍历的顺序编号存到线性表中

(如果你不进行扩展直接存,就无法表达出二叉树的父子之间的逻辑关系)


二叉树的链式存储:父子关系是通过节点的指针来反映的。

可以是两个域:数据域data ,指针域lchild ,rchild。//后续可以加到三个域 parent域

typedef struct BiTNode {
    char data;
    struct BiTNode* lchild;
    struct BiTNode* rchild;
    BiTNode() {
        lchild = NULL;
        rchild = NULL;
    }
}BiTNode, * BiTree;

顺便附上建立二叉树的代码

void BinaryTree::createTree(BiTree& node) {
    char ch;
    cin >> ch;
    if (ch == '#') {
        node = NULL;
    }
    else {
        node = new BiTNode;
        node->data = ch;
        createTree(node->lchild);
        createTree(node->rchild);
    }
}//根据前序遍历序列 以“#”作为空节点 进行重建二叉树

注:由前序/后序+中序遍历序列可以确定出唯一的二叉树,下面附上代码:

struct TreeNode* buildtree(char* inorder, char* postorder, int len) {
    if (len == 0) {
        return 0;
    }
    struct TreeNode* T = (struct TreeNode*)malloc(sizeof(TreeNode));
    T->val = postorder[len - 1];
    //    cout<<T->val;
        //在中根序列中找根节点
    int i = 0;
    while (postorder[len - 1] != inorder[i]&&i<len) {
        i++;
    }//i是最后根节点在中根序列中的下标
    if(i==len) { cout << "INVALID"; exit(0); }
    T->left = buildtree(inorder, postorder, i);//左面的一块
    T->right = buildtree(inorder + i + 1, postorder + i, len - i - 1);//i是下标
    return T;
}//中根+后根遍历重建二叉树

今日,以上。

猜你喜欢

转载自www.cnblogs.com/yoriko/p/12193690.html