利用层次遍历原理构建二叉树
层次遍历构建二叉树:
1.定义二叉树节点:
1 function TreeNode(val){ 2 this.val = val; 3 this.left = this.right = null; 4 }
2.层次遍历构建二叉树:
1 function createTree(arr){ 2 if(!arr||!arr.length)return null; 3 var root = new TreeNode(arr.shift()); 4 var list = [root]; 5 while(arr.length){ 6 var tmpList = []; 7 for(var i=0;i<list.length;i++){ 8 var p = list[i]; 9 var left = arr.shift(); 10 if(left!==null){ 11 p.left = new TreeNode(left); 12 } 13 var right = arr.shift(); 14 if(right!==null){ 15 p.right = new TreeNode(right); 16 } 17 if(p.left){ 18 tmpList.push(p.left); 19 } 20 if(p.right){ 21 tmpList.push(p.right); 22 } 23 } 24 list = tmpList; 25 } 26 return root; 27 }
3.测试
//var arr = [1,2,2,3,4,4,3]; var arr = [1,2,2,null,3,null,3]; var root = createTree(arr); console.log(root);
4 . 改善,一层循环 + 一个队列就可以了
C++实现:
1 TreeNode* createTree(const std::vector<int> vec) { 2 TreeNode* root = new TreeNode(); 3 std::queue<TreeNode*> queue_nodes; 4 queue_nodes.push(root); 5 int i = 1, size = vec.size(); 6 TreeNode *cur = root; 7 cur -> val = vec.front(); 8 while (!queue_nodes.empty() && i < size) { 9 cur = queue_nodes.front(); 10 queue_nodes.pop(); 11 if (vec[i] != INT_MIN) { 12 TreeNode *left = new TreeNode(); 13 left->val = vec[i]; 14 cur->left = left; 15 queue_nodes.push(left); 16 } 17 if (i + 1 < size) { 18 ++i; 19 if (vec[i] != INT_MIN) { 20 TreeNode *right = new TreeNode(); 21 right->val = vec[i]; 22 cur->right = right; 23 queue_nodes.push(right); 24 } 25 } 26 ++i; 27 } 28 return root; 29 } 30 31 std::vector<int> vec{5, 3, 6, 2, 4, INT_MIN, INT_MIN, 1}; 32 TreeNode *root = createTree(vec);