《劍指offer》之從上往下列印二叉樹
阿新 • • 發佈:2019-02-05
題目:從上往下打印出二叉樹的每個節點,同一層的節點按照從左到右的順序列印,例如圖,則依次打印出8,6,10,5,7,9,11.
分析:在學習資料結構的時候,我們學習了二叉樹的三種遍歷方式:前序,中序,後續遍歷,可是沒有一種是可以像題目中所要求的列印方式,這就要用到輔助工具了,我們知道佇列是一個先進先出的的結構,我們用佇列就可以很容易的解決這個題目,下面直接對程式碼進行解析:
本題是對於二叉樹與佇列的理解的考察,多資料結構相結合使用是面試中很喜歡出的題目,慢慢積累,如果對於二叉樹的基礎不夠理解,還是熟悉二叉樹的知識後再來理解就很容易了#include<iostream> #include <queue> using namespace std; struct BinaryTreeNode //二叉樹結構 { int m_nValue; BinaryTreeNode* m_pLeft; BinaryTreeNode* m_pRight; }; typedef struct BinaryTreeNode NODE; typedef struct BinaryTreeNode* PNODE; PNODE create(PNODE tree, PNODE r, int value) //建立二叉樹 { if (!r)//申請節點空間 { r = (PNODE)malloc(sizeof(NODE));//r=new BinaryTreeNode; if (!r)//已無記憶體,申請失敗 { printf("記憶體分配失敗!"); exit(0); } //初始化節點 r->m_pLeft = NULL; r->m_pRight = NULL; r->m_nValue = value; if (!tree)//二叉樹頭節點為空直接返回r節點; return r; if (value<tree->m_nValue) //當值小於頭節點值放在左節點,否則放右節點 tree->m_pLeft = r; else tree->m_pRight = r; return r; } if (value < r->m_nValue)//遞迴建立後面的二叉樹結點 create(r, r->m_pLeft, value); else create(r, r->m_pRight, value); return tree; } void PrintFromTopToBottom(BinaryTreeNode* pTreeNode)//列印個節點的值 { if (!pTreeNode)//判斷二叉樹是否為空,為空直接返回,增強程式魯棒性。 return; queue<BinaryTreeNode*> dequeTreeNode;//定義佇列 dequeTreeNode.push(pTreeNode);//頭節點放入佇列中 while (dequeTreeNode.size()){//迴圈取出節點放入佇列中 BinaryTreeNode *pNode = dequeTreeNode.front();//取出佇列中的第一個元素 dequeTreeNode.pop();//取出值之後就出佇列刪掉 cout << pNode->m_nValue;//列印取出來的值 if (pNode->m_pLeft)dequeTreeNode.push(pNode->m_pLeft);//左節點放入佇列 if (pNode->m_pRight)dequeTreeNode.push(pNode->m_pRight);//右節點放入佇列 } } int main() { int array[7]; PNODE tree = NULL; cout << "Please input array's element:"; for (int i = 0; i < 7; i++) { cin >> array[i]; tree = create(tree, tree, array[i]); } PrintFromTopToBottom(tree); system("pause"); return 0; }