剑指offer 23 - 从上往下打印二叉树
2015-05-25 19:53
253 查看
层序遍历:
8
6 10
5 7 9 11
依次打印:8,6,10,5,7,9,11
理解:层次遍历二叉树,借助队列,先将根入队列,根出列,打印根的值,并把根的左孩子和右孩子入队列,再出列,打印,入列(根的左孩子的 左孩子和右孩子),.....
8
6 10
5 7 9 11
依次打印:8,6,10,5,7,9,11
理解:层次遍历二叉树,借助队列,先将根入队列,根出列,打印根的值,并把根的左孩子和右孩子入队列,再出列,打印,入列(根的左孩子的 左孩子和右孩子),.....
#include <iostream> #include<deque> using namespace std; struct BinaryTreeNode { int m_nValue; BinaryTreeNode* m_pLeft; BinaryTreeNode* m_pRight; }; BinaryTreeNode* CreateBinaryTreeNode(int value) { BinaryTreeNode* node = new BinaryTreeNode[sizeof(BinaryTreeNode)]; node->m_nValue = value; node->m_pLeft = node->m_pRight = NULL; return node; } void ConnectTreeNodes(BinaryTreeNode* root ,BinaryTreeNode* left, BinaryTreeNode* right) { if(root !=NULL) { root->m_pLeft = left; root->m_pRight = right; } } void DestroyTree(BinaryTreeNode* pRoot) { if(pRoot != NULL) { BinaryTreeNode* pLeft = pRoot->m_pLeft; BinaryTreeNode* pRight = pRoot->m_pRight; delete pRoot; pRoot = NULL; DestroyTree(pLeft); DestroyTree(pRight); } } void PrintTreeNode(BinaryTreeNode* pNode) //节点打印(包含左右节点) { if(pNode !=NULL) { cout<<"value of this node is:"<<pNode->m_nValue<<endl; if(pNode->m_pLeft !=NULL) cout<<pNode->m_pLeft->m_nValue<<" "; else cout<<"left null"<<" "; if(pNode->m_pRight !=NULL) cout<<pNode->m_pRight->m_nValue<<" "; else cout<<"right null"<<" "; cout<<endl; } else return ; } void PrintTree(BinaryTreeNode* pRoot) //中序遍历 { PrintTreeNode(pRoot); if(pRoot != NULL) { if(pRoot->m_pLeft != NULL) PrintTree(pRoot->m_pLeft); if(pRoot->m_pRight != NULL) PrintTree(pRoot->m_pRight); } } void PrintFromTopToBottom(BinaryTreeNode *pRoot) //层序遍历 { if(pRoot == NULL) return ; deque<BinaryTreeNode*> dequeTreeNode; dequeTreeNode.push_back(pRoot); while( dequeTreeNode.size()) { BinaryTreeNode* node = dequeTreeNode.front(); dequeTreeNode.pop_front(); cout<<node->m_nValue<<" "; //输出 if(node->m_pLeft) //存储左 dequeTreeNode.push_back(node->m_pLeft); if(node->m_pRight) //存储右 dequeTreeNode.push_back(node->m_pRight); } } void Test(char *testName,BinaryTreeNode* root) { if(testName != NULL) cout<<testName<<" begins: "<<endl;; PrintTree(root); cout<<"The nodes from top to bottom, from left to right are: \n"; PrintFromTopToBottom(root); cout<<endl<<endl; } // 10 // / \ // 6 14 // /\ /\ // 4 8 12 16 void 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); ConnectTreeNodes(pNode10, pNode6, pNode14); ConnectTreeNodes(pNode6, pNode4, pNode8); ConnectTreeNodes(pNode14, pNode12, pNode16); Test("test1",pNode10); } // 5 // / // 4 // / // 3 // / // 2 // / // 1 void Test2() { BinaryTreeNode* pNode5 = CreateBinaryTreeNode(5); BinaryTreeNode* pNode4 = CreateBinaryTreeNode(4); BinaryTreeNode* pNode3 = CreateBinaryTreeNode(3); BinaryTreeNode* pNode2 = CreateBinaryTreeNode(2); BinaryTreeNode* pNode1 = CreateBinaryTreeNode(1); ConnectTreeNodes(pNode5, pNode4, NULL); ConnectTreeNodes(pNode4, pNode3, NULL); ConnectTreeNodes(pNode3, pNode2, NULL); ConnectTreeNodes(pNode2, pNode1, NULL); Test("Test2", pNode5); DestroyTree(pNode5); } // 1 // \ // 2 // \ // 3 // \ // 4 // \ // 5 void Test3() { BinaryTreeNode* pNode1 = CreateBinaryTreeNode(1); BinaryTreeNode* pNode2 = CreateBinaryTreeNode(2); BinaryTreeNode* pNode3 = CreateBinaryTreeNode(3); BinaryTreeNode* pNode4 = CreateBinaryTreeNode(4); BinaryTreeNode* pNode5 = CreateBinaryTreeNode(5); ConnectTreeNodes(pNode1, NULL, pNode2); ConnectTreeNodes(pNode2, NULL, pNode3); ConnectTreeNodes(pNode3, NULL, pNode4); ConnectTreeNodes(pNode4, NULL, pNode5); Test("Test3", pNode1); DestroyTree(pNode1); } // 树中只有1个结点 void Test4() { BinaryTreeNode* pNode1 = CreateBinaryTreeNode(1); Test("Test4", pNode1); DestroyTree(pNode1); } // 树中没有结点 void Test5() { Test("Test5", NULL); } int main() { Test1(); Test2(); Test3(); Test4(); Test5(); return 0; }
相关文章推荐
- 剑指offer之面试题23:从上往下打印二叉树
- 【面试题】剑指Offer-23-从上往下打印二叉树
- 剑指offer-4-面试23:从上往下打印二叉树
- 剑指offer——面试题23:从上往下打印二叉树
- 剑指offer-面试题23-从上往下打印二叉树
- 剑指offer 23. 从上往下打印二叉树
- 【剑指offer】面试题23:从上往下打印二叉树
- 剑指Offer 23 从上往下打印二叉树
- 【剑指offer 面试题23】从上往下打印二叉树
- 剑指offer-面试题23:从上往下打印二叉树
- 剑指offer-面试题23.从上往下打印二叉树
- 剑指offer-题23:从上往下打印二叉树
- 【剑指offer】面试题23:从上往下打印二叉树
- 剑指offer——面试题23:从上往下打印二叉树(树的递归创建,广度优先搜索,队列)
- 剑指Offer:面试题23 从上往下打印二叉树
- 剑指Offer----面试题23:从上往下打印二叉树(层序遍历)
- 剑指offer-面试题23-从上往下打印二叉树
- 剑指offer 23 从上往下打印二叉树
- 剑指Offer面试题23(Java版):从上往下打印二叉树
- 剑指offer面试题23 从上往下打印二叉树