题意大概也就是给你一个向量,然后创建一个完全二叉树 之前不管什么二叉树的创建都是直接用递归,简单又快捷,同样如果只是针对这个结果也能很快写出对应的代码 先贴出我自己的TreeNode类:
class TreeNode { public: int m_value; TreeNode* m_left, *m_right; TreeNode(int value, TreeNode* left, TreeNode* right) :m_value(value), m_left(left), m_right(right){} TreeNode(int value) :m_value(value), m_left(NULL), m_right(NULL){} };下面是用递归的方法创建完全二叉树:
void CreateTree(TreeNode *res,vector<int> a,int len,int pos) //从数组a中创建二叉树,len为向量a的长度。pos表示当前位置 { if(pos>len) return; (*res)=(BiTree)malloc(sizeof(TreeNode)); (*res)->m_value=a[pos]; CreateTree(&((*res)->m_left),a,len,2*pos+1); CreateTree(&((*res)->m_right),a,len,2*pos+2); }这样就能创建完成了,但是看到codewars上给的初始函数static TreeNode* arrayToTree(std::vector arr) 一时很难往递归的方向下手,于是一狠心来了个非递归的方法:
class Solution { public: static TreeNode *arrayToTree(std::vector<int> arr) { if(arr.size() == 0) return NULL; int begin = 0, len = arr.size(); TreeNode *tree, *sp; unsigned long way; char i, j; tree = new TreeNode(arr[begin++]); for (way = 2, i = 1; begin < len; begin++, way++) { if (!((way >> i) & 1))i++; for (j = i - 1, sp = tree; 1; j--) { if (way&(1 << j)) { if (sp->m_right)sp = sp->m_right; else { sp->m_right = new TreeNode(arr[begin]); break; } } else { if (sp->m_left)sp = sp->m_left; else { sp->m_left = new TreeNode(arr[begin]); break; } } } } return tree; } };思路如下: 首先判断参数arr是否为空,若空则直接返回NULL,否则进行如下操作: 若根节点标记为1,则根节点的左儿子为2,右儿子为3,以此类推,这部分用way表示,而i就存了所在的层数,然后每次都遍历一遍直到找到可供插入的节点。这样做会比较耗时间,后来通过测试以后看了别人的Solution,是真的简单,可以通过队列,也可以另外构造一个函数再进行简单的递归调用创建,这里就不贴了。