从数组构造二叉树代码

来源:互联网 发布:mysql pxc 架构 编辑:程序博客网 时间:2024/04/30 02:57

最近做二叉树的题目,写完代码想在本地编译运行,结果一时半会想不起树如何构造。而网上竟然也没有类似代码,于是自己写了个。

约定:二叉树采用宽度优先遍历来数组化,二叉树的节点按照BFS的顺序依次存储在数组内,数组中的’#’代表空节点,末尾的’#’可省略。
如:

    1   / \  2   3 / \   \4   5   6   / \  7   8

这棵树会被序列化为:{1,2,3,4,5,#,6,#,#,7,8},后面的四个#被省略。

          7       /    \    2         8  /   \        \ 1    6        10      /       /  \     3        9   11       \       5      /     4//数组应该为{7,2,8,1,6,#,10,#,#,3,#,#,#,9,11,#,#,#,#,#,5,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,4}
#include <iostream>#include <vector>#include <algorithm>using namespace std;//二叉树的节点定义class TreeNode {     public:         int val;         TreeNode *left, *right;         TreeNode(int val) {             this->val = val;             this->left = this->right = NULL;         }};//从数组的某个位置的元素开始生成树TreeNode* createTree(vector<int> list, int start){    if (list[start] == '#') {        return NULL;    }    TreeNode* root = new TreeNode(list[start]);    int lnode = 2*start + 1;    int rnode = 2*start + 2;    if ( lnode > list.size() -1) {        root -> left = NULL;    }else{        root -> left = createTree(list, lnode);    }    if (rnode > list.size() -1) {        root -> right =NULL;    }else{        root -> right = createTree(list, rnode);    }    return root;}//先序遍历函数void PreOrderTraverse(TreeNode *T)                {    if(T)    {        cout<<T->val<<" ";                        PreOrderTraverse(T->left);                   PreOrderTraverse(T->right);               }    return;}int main(){    vector<int> datanum = {1,2,3,4,5,'#',6,'#','#',7,8};    //1,2,3,4,5,'#',6,'#','#',7,8,'#','#','#','#' 后面的#可省略    TreeNode *t;    t = createTree(datanum, 0);    printf("The pre order is : ");    PreOrderTraverse(t);    //下面就可以用构造出的树做测试了    return 0;}
1 0
原创粉丝点击