从数组构造二叉树代码

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qilei2010/article/details/51383679

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

约定:二叉树采用宽度优先遍历来数组化,二叉树的节点按照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;
}


猜你喜欢

转载自blog.csdn.net/qilei2010/article/details/51383679