데이터 구조와 알고리즘 - 검색 알고리즘 - 이진 트리 찾기

 ################################################## ######

"" " 
A는, 트리 
1, 트리? 무슨 
트리 n은 데이터 구조 (N> = 1) 계층 적 관계를 갖는 노드들의 유한 집합. 
그것은 호출"트리 "때문에 그것은 루트입니다 상하 잎 말을하는 것입니다 거꾸로 트리처럼 보인다. 

그것은 다음과 같은 기능을 가지고 있습니다 : 
각 노드는 0 개 이상의 자식 노드를 가지고, 
노드에 부모 노드가 루트라고하지 않습니다있다 노드가, 
각각의 루트가 아닌 노드는 부모 노드를 갖고 
루트에 추가하여, 각 자식 노드가 분리 된 하위 트리의 복수로 분할 될 수있다; 

개념 : 
노드 정도 : 여러 노드가 종속, 
트리 정도의 트리의 노드의 최대이다 
잎 노드가 자식 노드가 아닌 
부모, 부모 노드, 
다음 레벨 인 자식 노드, 
형제, 같은 아버지 노드 
계층 노드 
트리 높이 또는 깊이, 큰 층인, 
"" "

 

 

 ################################################## ######

"" " 둘째, 이진 
트리 트리 및 무질서한 나무를 주문했다 만 연구는 이진 트리, 주문 우리 
이진 트리? 무엇 1, 
이진 트리, 트리가 (노드가 최대 2 포크에서) 더 악화에 비해 2입니다 
2 진 트리 구분 : 
1, 완전한 바이너리 트리 : 
리프 노드가 상기 하부 층 및 최하부 층 이진 트리 노드의 바닥층 한번 발생이 가장 왼쪽 위치의 다수의 층에 집중되어 
# 2, 완전한 바이너리 트리 
각 계층의 노드 수가 최대에 도달 한 경우 이진 트리가, 다음, 이진 트리 전체 이진 트리입니다 
완전 이진 트리가 완전 이진 트리해야하지만 반드시 완전한 이진 트리 전체 이진 트리입니다 
# 3, 균형 이진 트리 
# 4, 이진 정렬 나무 "" "


 

 ################################################## ######

"" " 

셋째는, 이진 트리 저장 

바이너리 시퀀스 테이블도 저장을 위해 사용 될 수 
있지만, 트리 나 체인점의 사용, 두 개의 노드에 연결하는 것입니다 
일반적인 장면 트리 응용 프로그램을 HTML은 나무되는 
시나리오 나무는 매우이다 이상의 

(1), 쇄 저장 
A, 체인점 이진 : 이진 트리 노드는 방식과 유사한 목록에서 노드 사이의 링크에 의해 연결된 물체로 정의된다. 
B, 노드 정의 
클래스 BiTreeNode : 
    는 def __init __ (셀프 데이터) #data 값이 노드에 전달 
        self.data = 데이터 
        self.lchild = 없음 
        self.rchild = 없음 

: C, 이진 트리 탐색 

의 I, 제 (앞에) 전순은 : 루트 액세스 동작이 발생할 통과하기 전에 왼쪽과 오른쪽 서브 트리를 

   수행합니다 이진 트리가 비어 있지 않으면, 다시 다음을 수행 : 
⑴ 루트 액세스, 
⑵ 왼쪽 서브 트리를 통과, 
⑶ 바로 하위 트리를 탐색. 
II, 예약 주문을 : 액세스 루트 노드 . 횡단하는 작업이있는 왼쪽과 오른쪽 서브 트리 (m) 발생 

     : 이진 트리가 비어 있지 않으면, 다시 다음을 수행 : 특정 작업 
; ⑴ 왼쪽 서브 트리를 통과 
⑵ 액세스 루트 매듭 ; 
⑶ 우측 서브 트리를 횡단. 
III를 postorder 순회 : 루트 노드에 액세스하는 좌우의 서브 트리를 횡단 한 후 발생한다.

      이진 트리가 비어 있지 않은 경우, 다시 다음을 수행 : 
⑴ 왼쪽 서브 트리를 통과, 
⑵ 우측 서브 트리를 통과, 
⑶ 루트 액세스를. 
IV는 이송 레벨 
현재 노드를 저장하는 큐의 순회 순서를 달성하기 위해서는 아이에 대해 액세스된다. 

"" "

 

#######################에 대한 ################## 이진 트리 탐색 코드

클래스 노드 (객체) :
"" " 노드 클래스 " "" 
    DEF  __init__ (자체, ELEM = -1, lchild = 없음, rchild = 없음) : 
        self.elem = ELEM 
        self.lchild = lchild   #는 두 아이가 
        self.rchild = rchild 

클래스 트리 ( 객체) :
     "" " 트리 기반 ", "" 
    DEF  __init__ (자체 루트 = 없음) : 
        self.root = 루트 

    DEF 추가 (자체, ELEM) :
         "" " 노드 트리를 추가 " ""
        노드는 = 노드 (ELEM)
         #을 나무가, 다음 루트 노드 할당 비어있는 경우 
        경우== self.root의 없음 : 
            self.root가 = 노드
         다른 :  = [] 
            queue.append (self.root) 
            # 이송 기존 노드 레벨을 
            그동안 큐 :   # 종료 조건은 큐가 비어 있다는, 
                # 팝업 큐 제 1 엘리먼트 
                CUR = queue.pop (0)
                 IF cur.lchild == 없음 : 
                    cur.lchild = 노드
                     
                ELIF cur.rchild == 없음 : 
                    cur.rchild = 노드
                     
                다른 :
                     # 왼쪽과 오른쪽 서브 트리가 비어 있지 않은 경우는, 큐가 추가 판단을 계속 
                    queue.append (cur.lchild) 
                    queue.append (cur.rchild) 


    #의 트리 탐색에 
    #을 ############# ################################################## #### 
    #의 너비 우선 탐색 
    DEF의 breadth_travel (자기)
         '' ' 를 사용 큐 구현 트리 계층 탐색 "" " 
        IF self.root == 없음 :
             리턴  = [self.root]
         그동안 큐 : 
            노드 = 큐. POP (0)
             인쇄 (node.elem)
             IF! = node.lchild 없음 : 
                queue.append (node.lchild) 
            IF node.rchild! = 없음 : 
                queue.append (node.rchild) 

    # ################## ############################################### 
    # 깊이 우선 통과 
    # 이 세 가지 방법 
    # 이 통과 코드가 통제 할 수없는,하지만 우리는 당신이, 당신은, 이진 트리를 그릴 수 있습니다 주문할 수 있어야하며이 추진하고 뒤로 패스가 될 것입니다 
    # 항상 예약 주문, 루트 우선 약의 
    DEF의 전순 (자체, 루트) :
         "" " 재귀 예약 주문 " "" 
        IF 루트 == 없음 :
             리턴 
        인쇄 (root.elem) 
        self.preorder (root.lchild) 
        self.preorder (루트. rchild) 

    #예약 주문 : 왼쪽, 오른쪽, 
    DEF 중위 (자체, 루트) :
         "" " 재귀 예약 주문 " "" 
        IF 루트 == 없음 :   # 이 최종 상태 재귀 
            반환 
        self.inorder이 (root.lchild) 
        인쇄 (root.elem) 
        self.inorder (root.rchild) 

    # 좌우 이후의 탐색, 
    DEF의 postorder (자체 루트) :
         "" " 재귀 이후의 탐색 " "" 
        IF 루트 == 없음 :
             리턴 
        self.postorder (루트 .lchild) 
        self.postorder (root.rchild) 
        인쇄 (root.elem) 


IF  __name__ == '__main__ ': 
    트리 = 트리 () 
    tree.add ( 1 ) 
    tree.add ( 2 ) 
    tree.add ( 3 ) 
    tree.add ( 4 ) 
    tree.add ( 5 ) 
    tree.breadth_travel ()

 

##############################################

  

##############################################

 ##############################################

 

추천

출처www.cnblogs.com/andy0816/p/12348246.html