1. 程式人生 > >LeetCode:Binary Tree Level Order Traversal二叉樹層次遍歷

LeetCode:Binary Tree Level Order Traversal二叉樹層次遍歷

=======題目描述=======

題目連結:https://leetcode.com/problems/binary-tree-level-order-traversal/

題目內容:

Binary Tree Level Order Traversal

Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, level by level).

For example:
Given binary tree [3,9,20,null,null,15,7],


return its level order traversal as:
[
  [3],
  [9,20],
  [15,7]
]

=======演算法實現=======

層次遍歷二叉樹

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution(object):
    def levelOrder(self, root):
        """
        :type root: TreeNode
        :rtype: List[List[int]]
        """
        if root ==None:
            return []
        #使用列表實現佇列功能,儲存root
        mQueue =[root]
        #定義儲存遍歷結果的變數
        mRes=[]
       #當佇列mQueue不為空時,進行遍歷
        while mQueue:
            #儲存節點變數,每次迴圈時置空
            nodes=[]
            #儲存節點的值
            nodeValues=[]
            for node in mQueue: 
                nodeValues.append(node.val)
                if node.left:
                    nodes.append(node.left)
                if node.right:
                    nodes.append(node.right) 
            #將新新增的節點重新賦值給mQueue
            mQueue=nodes
            mRes.append(nodeValues)

        return mRes

=======演算法筆記*二叉樹=======

樹是資料結構中非常重要的一種,主要的用途是用來提高查詢效率,對於要重複查詢的情況效果更佳。

定義

有且僅有一個根結點,除根節點外,每個結點只有一個父結點最多含有兩個子節點,子節點有左右之分
 

儲存結構

 二叉樹的儲存結構可以採用順序儲存,也可以採用鏈式儲存,其中鏈式儲存更加靈活。

 在鏈式儲存結構中,與線性連結串列類似,二叉樹的每個結點採用結構體表示,結構體包含三個域:資料域、左指標、右指標。


二叉樹的遍歷

“遍歷”是二叉樹各種操作的基礎。二叉樹是一種非線性結構,其遍歷不像線性連結串列那樣容易,無法通過簡單的迴圈實現。

樹的遍歷主要有兩種,一種是深度優先遍歷,像前序、中序、後序;另一種是廣度優先遍歷,像層次遍歷。在樹結構中兩者的區別還不是非常明顯,但從樹擴充套件到有向圖,到無向圖的時候,深度優先搜尋和廣度優先搜尋的效率和作用還是有很大不同的。

深度優先一般用遞迴,廣度優先一般用佇列。一般情況下能用遞迴實現的演算法大部分也能用堆疊來實現。

#前序遍歷   
def preorder(self,root):
     if(root is None):
       return
     print root.val
     self.preorder(root.left)
     self.preorder(root.right)

#後序遍歷
def postorder(self,root):
     if(root is None):
       return
     self.postorder(root.left)
     self.postorder(root.right)
     print root.val   
#中序遍歷   
def inorder(self,root):
     if(root is None):
       return
     self.inorder(root.left)
     print root.val
     self.inorder(root.right) 

參考:

https://blog.csdn.net/zhaoxianyong/article/details/7165386

https://www.jb51.net/article/115242.htm

https://mp.weixin.qq.com/s/fRUmNbIF41882THNBionJw