今天在劍指offer上刷了樹的層次遍歷
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
vector<int> PrintFromTopToBottom(TreeNode* root)
{
vector<int> res; //存放結果
queen<TreeNode*> q; //創建一個隊列
TreeNode* temp;
if(root == NULL)
return res;
q.push(root); //root node into the queen
while(!q.empty()) //隊列不爲空不結束
{
temp = q.front(); //temp point to the first element of queen
res.push_back(temp->val); //res +=temp.val
if(temp->left!=NULL)
q.push(temp->left); //Tree node in turn into the quene
if(temp->right != NULL)
q.push(temp->right);
q.pop();
}
return res;
}
思路就是創建一個隊列,首先根節點入隊,然後根節點值存入vector中,然後遍歷左節點和右節點,分別入隊,然後pop 隊列的第一個點,然後循環,最後隊列爲空結束。
下面是python版本
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
# 返回從上到下每個節點值列表,例:[1,2,3]
def PrintFromTopToBottom(self, root):
# write code here
res = []
if not root:
return []
q = [root]
while len(q):
t = q.pop(0) //這裏和C++不一樣的是由於取隊列的第一個值的方式不同,python這裏是把第一個值吐出來,C++是
用.front()函數讀這個數,最後在一次循環的最後pop出
res.append(t.val)
if t.left:
q.append(t.left)
if t.right:
q.append(t.right)
return res
還複習了一下隊列的使用方式:
queue單向隊列與棧有點類似,一個是在同一端存取數據,另一個是在一端存入數據,另一端取出數據。單向隊列中的數據是先進先出(First
In First Out,FIFO)。在STL中,單向隊列也是以別的容器作爲底部結構,再將接口改變,使之符合單向隊列的特性就可以了。因此實現也是非常方便的。下面就給出單向隊列的函數列表和VS2008中單向隊列的源代碼。單向隊列一共6個常用函數(front()、back()、push()、pop()、empty()、size()),與棧的常用函數較爲相似。
push 是在尾部增加數據
pop是默認在頭部刪除數據