zoukankan      html  css  js  c++  java
  • 二叉树的存储结构 以及重建二叉树

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

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


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

    可以是两个域:数据域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;
    }//中根+后根遍历重建二叉树

    今日,以上。

  • 相关阅读:
    go时间和日期转换
    go操作mysql
    Python常见错误处理
    C++ 常见问题
    CF605E Intergalaxy Trips
    均分纸牌详解
    P4447 [AHOI2018初中组]分组
    P4537 [CQOI2007]矩形
    P4823 [TJOI2013]拯救小矮人
    P5132 Cozy Glow之拯救小马国
  • 原文地址:https://www.cnblogs.com/yoriko/p/12193690.html
Copyright © 2011-2022 走看看