From 033ffe88a6ea23d403513b45d7fa43bcacdc7bf4 Mon Sep 17 00:00:00 2001 From: xusiwei1236 Date: Fri, 16 Oct 2015 22:09:07 +0800 Subject: [PATCH] new solution of "Binary Tree Level Order Traversal" --- .../binaryTreeLevelOrderTraversal.cpp | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/algorithms/binaryTreeLevelOrderTraversal/binaryTreeLevelOrderTraversal.cpp b/algorithms/binaryTreeLevelOrderTraversal/binaryTreeLevelOrderTraversal.cpp index a1418430d..a5c1225c0 100644 --- a/algorithms/binaryTreeLevelOrderTraversal/binaryTreeLevelOrderTraversal.cpp +++ b/algorithms/binaryTreeLevelOrderTraversal/binaryTreeLevelOrderTraversal.cpp @@ -65,12 +65,16 @@ struct TreeNode { vector > levelOrder1(TreeNode *root); vector > levelOrder2(TreeNode *root); +vector > levelOrder3(TreeNode *root); vector > levelOrder(TreeNode *root) { if (random()%2){ return levelOrder1(root); } + if (random()%2){ + return levelOrder3(root); + } return levelOrder2(root); } @@ -149,6 +153,35 @@ vector > levelOrder2(TreeNode *root) { return vv; } +vector > levelOrder3(TreeNode *root) { + vector< vector > vv; + if(root == NULL) return vv; + + int level = 0; // current level. + TreeNode *last = root; // last node of currrent level. + queue q; + + q.push(root); + vv.push_back(vector()); + while(!q.empty()) { + TreeNode *p = q.front(); + q.pop(); + + vv[level].push_back(p->val); + if(p->left ) q.push(p->left); + if(p->right) q.push(p->right); + + if(p == last) { + level++; + last = q.back(); + vv.push_back(vector()); // new buffer for next row. + } + } + vv.pop_back(); + + return vv; +} + void printTree(TreeNode *root) { if (root == NULL){