// face questions 32 (b): a binary tree branches are printed upside down // Title: printing the binary tree in layers from top to bottom, from left to right to print the same node layer, each layer // print to line. #include <cstdio> #include " BinaryTree.h " #include <Queue> void Print(BinaryTreeNode* pRoot) { if (pRoot == nullptr) return; std::deque<BinaryTreeNode*> dequeTreeNode; dequeTreeNode.push_back(pRoot); int nextLevel = 0 ; // number of times required to print the next layer int toBePrinted = . 1 ; // current number of layers to be printed while (!dequeTreeNode.empty()) { BinaryTreeNode* pNode = dequeTreeNode.front(); dequeTreeNode.pop_front(); printf("%d ", pNode->m_nValue); if (pNode->m_pLeft) { dequeTreeNode.push_back(pNode->m_pLeft); ++nextLevel; } if (pNode->m_pRight) { dequeTreeNode.push_back(pNode->m_pRight); ++nextLevel; } --toBePrinted; // print number -1 IF (toBePrinted == 0 ) // current layer printing is complete, reset the data { toBePrinted = nextLevel; nextLevel = 0; printf("\n"); } } }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
// ==================== ==================== test code // 8 // 6 10 // . 5. 7. 9. 11 void Test1 () { BinaryTreeNode* pNode8 = CreateBinaryTreeNode(8); BinaryTreeNode* pNode6 = CreateBinaryTreeNode(6); BinaryTreeNode* pNode10 = CreateBinaryTreeNode(10); BinaryTreeNode* pNode5 = CreateBinaryTreeNode(5); BinaryTreeNode* pNode7 = CreateBinaryTreeNode(7); BinaryTreeNode* pNode9 = CreateBinaryTreeNode(9); BinaryTreeNode* pNode11 = CreateBinaryTreeNode(11); ConnectTreeNodes(pNode8, pNode6, pNode10); ConnectTreeNodes(pNode6, pNode5, pNode7); ConnectTreeNodes(pNode10, pNode9, pNode11); printf("====Test1 Begins: ====\n"); printf("Expected Result is:\n"); printf("8 \n"); printf("6 10 \n"); printf("5 7 9 11 \n\n"); printf("Actual Result is: \n"); Print(pNode8); printf("\n"); DestroyTree(pNode8); } // 5 // 4 // 3 // 2 void Test2() { BinaryTreeNode* pNode5 = CreateBinaryTreeNode(5); BinaryTreeNode* pNode4 = CreateBinaryTreeNode(4); BinaryTreeNode* pNode3 = CreateBinaryTreeNode(3); BinaryTreeNode* pNode2 = CreateBinaryTreeNode(2); ConnectTreeNodes(pNode5, pNode4, nullptr); ConnectTreeNodes(pNode4, pNode3, nullptr); ConnectTreeNodes(pNode3, pNode2, nullptr); printf("====Test2 Begins: ====\n"); printf("Expected Result is:\n"); printf("5 \n"); printf("4 \n"); printf("3 \n"); printf("2 \n\n"); printf("Actual Result is: \n"); Print(pNode5); printf("\n"); DestroyTree(pNode5); } // 5 // 4 // 3 // 2 void Test3() { BinaryTreeNode* pNode5 = CreateBinaryTreeNode(5); BinaryTreeNode* pNode4 = CreateBinaryTreeNode(4); BinaryTreeNode* pNode3 = CreateBinaryTreeNode(3); BinaryTreeNode* pNode2 = CreateBinaryTreeNode(2); ConnectTreeNodes(pNode5, nullptr, pNode4); ConnectTreeNodes(pNode4, nullptr, pNode3); ConnectTreeNodes(pNode3, nullptr, pNode2); printf("====Test3 Begins: ====\n"); printf("Expected Result is:\n"); printf("5 \n"); printf("4 \n"); printf("3 \n"); printf("2 \n\n"); printf("Actual Result is: \n"); Print(pNode5); printf("\n"); DestroyTree(pNode5); } void Test4() { BinaryTreeNode* pNode5 = CreateBinaryTreeNode(5); printf("====Test4 Begins: ====\n"); printf("Expected Result is:\n"); printf("5 \n\n"); printf("Actual Result is: \n"); Print(pNode5); printf("\n"); DestroyTree(pNode5); } void Test5() { printf("====Test5 Begins: ====\n"); printf("Expected Result is:\n"); printf("Actual Result is: \n"); Print(nullptr); printf("\n"); } // 100 // / // 50 // \ // 150 void Test6() { BinaryTreeNode* pNode100 = CreateBinaryTreeNode(100); BinaryTreeNode* pNode50 = CreateBinaryTreeNode(50); BinaryTreeNode* pNode150 = CreateBinaryTreeNode(150); ConnectTreeNodes(pNode100, pNode50, nullptr); ConnectTreeNodes(pNode50, nullptr, pNode150); printf("====Test6 Begins: ====\n"); printf("Expected Result is:\n"); printf("100 \n"); printf("50 \n"); printf("150 \n\n"); printf("Actual Result is: \n"); Print(pNode100); printf("\n"); } int main(int argc, char* argv[]) { Test1(); Test2 (); Test3 (); Test4 (); Test5(); Test6 (); return 0; }
Analysis: Extra set flags to control Enter.