剑指Offer----面试题23:从上往下打印二叉树(层序遍历)

来源:互联网 发布:淘宝十大黑科技 编辑:程序博客网 时间:2024/06/05 09:07

题目:


从上往下打印出二叉树的每个结点,同一层的结点按照从左到右的顺序打印。如下图的二叉树,则依次打印出8,6,10,5,7,9,11.


分析:



源代码:

#include"BinaryTree.h"#include<iostream>#include<queue>using std::cout;using std::endl;using std::queue;using namespace OrdinaryBinaryTreeSpace4;void PrintTreeFromTopToBottom(BinaryTreeNode *root){if (root == NULL){ cout << "The tree is empty" << endl;return;}queue<BinaryTreeNode *> myQueue;myQueue.push(root);while (!myQueue.empty()){BinaryTreeNode *temp = myQueue.front();myQueue.pop();cout << temp->element << "  ";if (temp->left != NULL)myQueue.push(temp->left);if (temp->right != NULL)myQueue.push(temp->right);}}void test11(){cout << "\t=======从上往下打印满二叉树" << endl;BinaryTreeNode *node1 = CreateBinaryTreeNode(8);BinaryTreeNode *node2 = CreateBinaryTreeNode(6);BinaryTreeNode *node3 = CreateBinaryTreeNode(10);BinaryTreeNode *node4 = CreateBinaryTreeNode(5);BinaryTreeNode *node5 = CreateBinaryTreeNode(7);BinaryTreeNode *node6 = CreateBinaryTreeNode(9);BinaryTreeNode *node7 = CreateBinaryTreeNode(11);ConnectBinaryTreeNodes(node1, node2, node3);ConnectBinaryTreeNodes(node2, node4, node5);ConnectBinaryTreeNodes(node3, node6, node7);ConnectBinaryTreeNodes(node4, NULL, NULL);ConnectBinaryTreeNodes(node5, NULL, NULL);ConnectBinaryTreeNodes(node6, NULL, NULL);ConnectBinaryTreeNodes(node7, NULL, NULL);PrintTreeFromTopToBottom(node1);DestoryTree(node1);}void test12(){cout << "\t=======从上往下打印空二叉树" << endl;PrintTreeFromTopToBottom(NULL);}/*1   / \  2   3     / \4   5   /  6*/void test13(){cout << "\t=======从上往下打印不完全二叉树" << endl;BinaryTreeNode *node1 = CreateBinaryTreeNode(1);BinaryTreeNode *node2 = CreateBinaryTreeNode(2);BinaryTreeNode *node3 = CreateBinaryTreeNode(3);BinaryTreeNode *node4 = CreateBinaryTreeNode(4);BinaryTreeNode *node5 = CreateBinaryTreeNode(5);BinaryTreeNode *node6 = CreateBinaryTreeNode(6);ConnectBinaryTreeNodes(node1, node2, node3);ConnectBinaryTreeNodes(node2, NULL, NULL);ConnectBinaryTreeNodes(node3, node4, node5);ConnectBinaryTreeNodes(node4, node6, NULL);ConnectBinaryTreeNodes(node5, NULL, NULL);ConnectBinaryTreeNodes(node6, NULL, NULL);PrintTreeFromTopToBottom(node1);DestoryTree(node1);}/*1   /  2 /3   /  4 /5   /  6 /7*/void test14(){cout << "\t=======从上往下打印只有左孩子的二叉树" << endl;BinaryTreeNode *node1 = CreateBinaryTreeNode(1);BinaryTreeNode *node2 = CreateBinaryTreeNode(2);BinaryTreeNode *node3 = CreateBinaryTreeNode(3);BinaryTreeNode *node4 = CreateBinaryTreeNode(4);BinaryTreeNode *node5 = CreateBinaryTreeNode(5);BinaryTreeNode *node6 = CreateBinaryTreeNode(6);BinaryTreeNode *node7 = CreateBinaryTreeNode(7);ConnectBinaryTreeNodes(node1, node2, NULL);ConnectBinaryTreeNodes(node2, node3, NULL);ConnectBinaryTreeNodes(node3, node4, NULL);ConnectBinaryTreeNodes(node4, node5, NULL);ConnectBinaryTreeNodes(node5, node6, NULL);ConnectBinaryTreeNodes(node6, node7, NULL);ConnectBinaryTreeNodes(node7, NULL, NULL);PrintTreeFromTopToBottom(node1);DestoryTree(node1);}void test15(){cout << "\t=======从上往下打印只有右孩子的二叉树" << endl;BinaryTreeNode *node1 = CreateBinaryTreeNode(1);BinaryTreeNode *node2 = CreateBinaryTreeNode(2);BinaryTreeNode *node3 = CreateBinaryTreeNode(3);BinaryTreeNode *node4 = CreateBinaryTreeNode(4);BinaryTreeNode *node5 = CreateBinaryTreeNode(5);BinaryTreeNode *node6 = CreateBinaryTreeNode(6);BinaryTreeNode *node7 = CreateBinaryTreeNode(7);ConnectBinaryTreeNodes(node1, NULL, node2);ConnectBinaryTreeNodes(node2, NULL, node3);ConnectBinaryTreeNodes(node3, NULL, node4);ConnectBinaryTreeNodes(node4, NULL, node5);ConnectBinaryTreeNodes(node5, NULL, node6);ConnectBinaryTreeNodes(node6, NULL, node7);ConnectBinaryTreeNodes(node7, NULL, NULL);PrintTreeFromTopToBottom(node1);DestoryTree(node1);}int main(){test11();cout << endl;test12();cout << endl;test13();cout << endl;test14();cout << endl;test15();cout << endl;system("pause");return 0;}

运行结果:
        =======从上往下打印满二叉树8  6  10  5  7  9  11        =======从上往下打印空二叉树The tree is empty        =======从上往下打印不完全二叉树1  2  3  4  5  6        =======从上往下打印只有左孩子的二叉树1  2  3  4  5  6  7        =======从上往下打印只有右孩子的二叉树1  2  3  4  5  6  7请按任意键继续. . .

官方源代码:

#include"BinaryTree.h"#include<cstdlib>#include<cstdio>#include<deque>using namespace OrdinaryBinaryTreeSpace4;void PrintFromTopToBottom(BinaryTreeNode* pRoot){if (pRoot == NULL)return;std::deque<BinaryTreeNode *> dequeTreeNode;dequeTreeNode.push_back(pRoot);while (dequeTreeNode.size()){BinaryTreeNode *pNode = dequeTreeNode.front();dequeTreeNode.pop_front();printf("%d ", pNode->element);if (pNode->left)dequeTreeNode.push_back(pNode->left);if (pNode->right)dequeTreeNode.push_back(pNode->right);}}// ====================测试代码====================void Test(char* testName, BinaryTreeNode* pRoot){if (testName != NULL)printf("%s begins: \n", testName);PrintTreePre(pRoot);printf("The nodes from top to bottom, from left to right are: \n");PrintFromTopToBottom(pRoot);printf("\n\n");}//            10//         /      \//        6        14//       /\        /\//      4  8     12  16void Test1(){BinaryTreeNode* pNode10 = CreateBinaryTreeNode(10);BinaryTreeNode* pNode6 = CreateBinaryTreeNode(6);BinaryTreeNode* pNode14 = CreateBinaryTreeNode(14);BinaryTreeNode* pNode4 = CreateBinaryTreeNode(4);BinaryTreeNode* pNode8 = CreateBinaryTreeNode(8);BinaryTreeNode* pNode12 = CreateBinaryTreeNode(12);BinaryTreeNode* pNode16 = CreateBinaryTreeNode(16);ConnectBinaryTreeNodes(pNode10, pNode6, pNode14);ConnectBinaryTreeNodes(pNode6, pNode4, pNode8);ConnectBinaryTreeNodes(pNode14, pNode12, pNode16);Test("Test1", pNode10);DestoryTree(pNode10);}//               5//              ///             4//            ///           3//          ///         2//        ///       1void Test2(){BinaryTreeNode* pNode5 = CreateBinaryTreeNode(5);BinaryTreeNode* pNode4 = CreateBinaryTreeNode(4);BinaryTreeNode* pNode3 = CreateBinaryTreeNode(3);BinaryTreeNode* pNode2 = CreateBinaryTreeNode(2);BinaryTreeNode* pNode1 = CreateBinaryTreeNode(1);ConnectBinaryTreeNodes(pNode5, pNode4, NULL);ConnectBinaryTreeNodes(pNode4, pNode3, NULL);ConnectBinaryTreeNodes(pNode3, pNode2, NULL);ConnectBinaryTreeNodes(pNode2, pNode1, NULL);Test("Test2", pNode5);DestoryTree(pNode5);}// 1//  \//   2//    \//     3//      \//       4//        \//         5void Test3(){BinaryTreeNode* pNode1 = CreateBinaryTreeNode(1);BinaryTreeNode* pNode2 = CreateBinaryTreeNode(2);BinaryTreeNode* pNode3 = CreateBinaryTreeNode(3);BinaryTreeNode* pNode4 = CreateBinaryTreeNode(4);BinaryTreeNode* pNode5 = CreateBinaryTreeNode(5);ConnectBinaryTreeNodes(pNode1, NULL, pNode2);ConnectBinaryTreeNodes(pNode2, NULL, pNode3);ConnectBinaryTreeNodes(pNode3, NULL, pNode4);ConnectBinaryTreeNodes(pNode4, NULL, pNode5);Test("Test3", pNode1);DestoryTree(pNode1);}// 树中只有1个结点void Test4(){BinaryTreeNode* pNode1 = CreateBinaryTreeNode(1);Test("Test4", pNode1);DestoryTree(pNode1);}// 树中没有结点void Test5(){Test("Test5", NULL);}int main(){Test1();Test2();Test3();Test4();Test5();system("pause");return 0;}

运行结果:
Test1 begins:10  6  4  8  14  12  16  The nodes from top to bottom, from left to right are10 6 14 4 8 12 16Test2 begins:5  4  3  2  1  The nodes from top to bottom, from left to right are:5 4 3 2 1Test3 begins:1  2  3  4  5  The nodes from top to bottom, from left to right are:1 2 3 4 5Test4 begins:1  The nodes from top to bottom, from left to right are:1Test5 begins:The tree is emptyThe nodes from top to bottom, from left to right are:请按任意键继续. . .




0 0