1. 程式人生 > >Python實現二叉樹,前後中序層次遍歷,並按層次列印

Python實現二叉樹,前後中序層次遍歷,並按層次列印

二叉樹的實現及遍歷

# -*- coding:utf-8 -*-
'''
用Python實現樹,並遍歷。
'''


class Node():
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None


def depth(root):
        if root is None:
            return 0
        else:
            return 1 + max(depth(root.left), depth(root.right))

    #前序遍歷
def pre_order(root): if root is None: return else: print(root.val) pre_order(root.left) pre_order(root.right) #中序遍歷 def mid_order(root): if root is None: return else: mid_order(root.left) print(root.val) mid_order(root.right) #後序遍歷
def post_order(root): if root is None: return else: post_order(root.left) post_order(root.right) print(root.val) #層次遍歷 def level_order(root): if root is None: return q = [] q.append(root) while q: current = q.pop(0
) print(current.val) if current.left != None: q.append(current.left) if current.right != None: q.append(current.right) #按層次列印 def level_print(root): if root is None: return [] p = [root] results = [] current_level_num = 1 next_level_num = 0 d = [] while p: current = p.pop(0) d.append(current.val) current_level_num -= 1 if current.left: p.append(current.left) next_level_num += 1 if current.right: p.append(current.right) next_level_num += 1 if current_level_num == 0: current_level_num = next_level_num next_level_num = 0 results.append(d) d = [] return results[::-1] if __name__ == '__main__': a = Node(3) b = Node(9) c = Node(20) d = Node('null') e = Node('null') f = Node(15) g = Node(7) a.left = b a.right = c b.left = d b.right = e c.left = f c.right = g print('深度:%d' % depth(a)) print("前序遍歷:") print(pre_order(a)) print('中序遍歷:') print(mid_order(a)) print('後序遍歷:') print(post_order(a)) level_order(a) print(level_print(a))

知識點:

1. 遍歷

所謂遍歷是指對樹中所有結點的資訊的訪問,即依次對樹中每個結點訪問一次且僅訪問一次。
樹的兩種重要的遍歷模式是深度優先遍歷和廣度優先遍歷:

  • 深度優先一般用遞迴
  • 廣度優先一般用佇列

以上兩種是針對普通樹,而前序、中序、後序遍歷是針對二叉樹。
1、前序遍歷:
2、中序遍歷
3、後序遍歷
4、層次遍歷(廣度遍歷)

問題 :哪兩種遍歷方式能顧唯一確定一棵樹?

答:中序+先序、中序+後序、中序+層次都可以確定一棵樹。但先序和後序無法確定一棵樹。

2. 二叉排序樹(BST)又稱二叉查詢樹、二叉搜尋樹

二叉排序樹(Binary Sort Tree)又稱二叉查詢樹。它或者是一棵空樹;或者是具有下列性質的二叉樹:
1.若左子樹不空,則左子樹上所有結點的值均小於根結點的值;
2.若右子樹不空,則右子樹上所有結點的值均大於根節點的值;
3.左、右子樹也分別為二叉排序樹。

從二叉查詢樹BST中查詢元素X,返回其所在結點的地址,查詢的次數取決於樹的高度。

3.平衡二叉樹(AVL樹)

平衡二叉樹的定義(Balance Binary tree):
1.空樹;
2.任意節點左右子樹的高度差不超過1,即|BF|<=1。

相關推薦

java實現的構建以及3種方法

輸出 for () 如果 順序 bintree 參考 oca gpl 轉載自http://ocaicai.iteye.com/blog/1047397 大二下學期學習數據結構的時候用C介紹過二叉樹,但是當時熱衷於java就沒有怎麽鳥二叉樹,但是對二叉樹的構建及遍歷一

遞迴非遞迴層次反轉輸出路徑等常見操作詳細總結

1.序言 在實際工作中,很多業務場景其實也需要一些比較巧妙的演算法來支撐,並不是業務邏輯就全是複製貼上或者說重複的程式碼寫一百遍。越是隨著演算法研究的深入,越是發現數據結構的重要性。或者說,資料結構中就蘊藏著無數精妙演算法的思想,很多演算法的思想在資料結構中體現得非常突出。而作為一種

C語言實現的基本操作---建立、、求深度、求葉子結點

#include <stdio.h> #include <stdlib.h> #include <malloc.h> typedefint ElemType;//資料型別 //定義二叉樹結構,與單鏈表相似,多了一個右孩子結點 typed

java實現的建立及5種

用java實現的陣列建立二叉樹以及遞迴先序遍歷,遞迴中序遍歷,遞迴後序遍歷,非遞迴前序遍歷,非遞迴中序遍歷,非遞迴後序遍歷,深度優先遍歷,廣度優先遍歷8種遍歷方式: package myTest; import java.util.ArrayList; import j

遞迴和非遞迴實現的建立和三種

#include<stdio.h> #include<stdlib.h> #define SIZE 2

Python實現前後層次層次列印

樹 二叉樹的實現及遍歷 # -*- coding:utf-8 -*- ''' 用Python實現樹,並遍歷。 ''' class Node(): def __init__(self, x): self.val = x

Python實現的建立以及(遞迴前、後隊棧前、後層次

class Node: def __init__(self,data): self.data=data self.lchild=None self.rchild=None class Tree: def __init__(se

python實現 的前層次——遞迴與非遞迴

前序遍歷 # ------ coding:utf-8 ------- class TreeNode: def __init__(self, x): self.val = x

Python實現

二叉樹的遍歷 終端 ini right name 一個 pan 樹的遍歷 二叉樹 二叉樹是有限個元素的集合,該集合或者為空、或者有一個稱為根節點(root)的元素及兩個互不相交的、分別被稱為左子樹和右子樹的二叉樹組成。 二叉樹的每個結點至多只有二棵子樹(不存在度大於2的結

python-實現

__main__ 處理 後序 print binary pos 優先 pan 實現 # encoding=utf-8 class Node(object): def __init__(self, item): self.item = item

Python實現的非遞歸先

結果 leetcode logs [] 列表 遍歷 不存在 preorder bin 思路: 1. 使用列表保存結果; 2. 使用棧(列表實現)存儲結點; 3. 當根結點存在,保存結果,根結點入棧; 4. 將根結點指向左子樹; 5. 根結點不存在,棧頂元素出棧,並將根結點指

python實現深度

1、什麼是深度優先遍歷       其實深度優先遍歷你可以把它看成是前序遍歷,比如對於如下二叉樹:               其深度遍歷的結果是:1,2,4,8,9,5,3,6,7

python實現層次(寬度優先或叫廣度優先

1、何為層次遍歷       說白了,就是一層一層、由上至下、由左至右的搜尋遍歷二叉樹中的元素。                上面這個二叉樹,那麼層次遍歷的輸出應該是:1、2、

Python實現相關

程式碼如下: class Node(object): """""" def __init__(self, item): self.elem = item self.lchild = None self.rchild = No

python實現及其

class Node(): def __init__(self,data=-1): self.data=data self.left=None self.right=None class Tree(): def __init__(

python 實現

以上為按層次生成的二叉樹。 關於二叉樹簡單的操作包括二叉樹節點的定義、二叉樹的生成、二叉樹的前序遍歷、中序遍歷、後序遍歷。 1.首先關於節點的定義: """ @ python 二叉樹及其遍歷 @ author: blackzero """ ''' 1. 首先定義樹節點的

C++實現建立、前、後、層

看完資料結構二叉樹部分後,通過學習書上的虛擬碼以及其他人的程式碼自己動手實現了一下,採用前序方式建立一顆二叉樹,實現了前中後層四種遍歷方式。 在層序遍歷部分與前三種遍歷不同,層序遍歷採用從根節點開始從上到下逐層遍歷,所以藉助佇列來實現,開始遍歷後,將根節點先壓入佇列,然後將

利用python實現

樹的基本概念 - 樹的節點不能形成迴路 - 森林是由多個數組成 樹形結構的專有名詞介紹 度數:每一個節點的所有子樹的個數 層數:樹的層數 高度:樹的最大層數 樹葉或終端節點:度數為零的節點 父節點:與這個節點有連結的上一層節點 子節點:每

實現(包括前、後演算法)

以前沒有記筆記的習慣,結果發現曾經實現過的東西居然都忘了,現在又需要花時間去看,去寫,雖然又有所收穫,但是畢竟在走重複的路。 從今天起,開始打路標,為了以後少走回頭路:) 還請高手多指點,不勝感激! 用Java語言實現二叉樹: 1、首先定義一個二叉樹節點類:實現 1)向某個

python 實現的深度&&廣度優先

本文首發於公眾號「zone7」,關注獲取最新推文! 概述 前言 什麼是樹 什麼是二叉樹 深度優先 廣度優先 後記 前言 前面說到演算法被虐了,這回我要好好把它啃下來。哪裡跌倒就要從哪裡站起來。這是我複習演算法與資料結構時的小筆記,這裡就 po 出來,給大家